OpenResty--LUA用FFI库调用C函数实例,openresty--luaffi


说明:因为在OR最佳实践里面已经有了讲解FFI调用C函数的内容,所以本文就以一个例子从C函数编写到最后调用来演示Lua如何调C函数,其重点在于指针类型数据如何在Lua和C层代码传递。

过程:

1.C层编写一个函数,排序一个数组,将其编译成动态库。

2.Lua层代码调用

3.显示结果


C语言代码(fast_sort.c):因为刚好之前写过一个快速排序的C代码,就拿过来用了。

int fast(int *a,int m,int n){  
	int key;
	int i,j;
	if(m<n){
		i=m;
		j=n;
		key=a[i];
		while(i<j){							
			while(i<j && a[j]>key){			
				j--;
			}
			if(i<j){
				a[i++]=a[j];				
				//i++;
			}
			while(i<j && a[i]<key){			
				i++;
			}
			if(i<j){
				a[j--]=a[i];				
				//j--;
			}
		}
		a[i]=key;
		fast(a,m,i-1);						
		fast(a,i+1,n);						
	}
	
}

编译成动态库:

gcc -g -o libluacallc.so -fPIC -shared fast_sort.c

然后,将得到的so库放在lualib目录下,放到该目录下因为我的nginx.conf中设置的lua_package_cpath "/usr/local/openresty/lualib/?.so;;";,其为so的寻找位置。

编写lua代码(lua_call_c.lua):

local ffi=require"ffi"
local myffi=ffi.load("luacallc")
--lua 数组映射到C层
ffi.cdef[[
int fast(int *t,int n,int m);
]]  
local t={55,29,11,33,222,77,20,55,90,0}
local len=#t
local t_c=ffi.new("int[?]",len,t)
local re=myffi.fast(t_c,0,len-1)
--因为得到的t_c为cdata数据,需要转换回lua数据
local sorted_t={}
for i=1,len do
	sorted_t[i]=t_c[i-1]
end
ngx.say("origin t: ",table.concat(t,","))
ngx.say("sorted t: ",table.concat(sorted_t,","))

显示结果如下:

至此,Lua调C函数实例结束。


更多细节可以参考一下下面的连接。

参考资源(重要):http://luajit.org/ext_ffi.html

相关内容

    暂无相关文章