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

来源:互联网 发布:淘宝客服怎么认证 编辑:程序博客网 时间:2024/05/20 07:18

说明:因为在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=#tlocal 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 dosorted_t[i]=t_c[i-1]endngx.say("origin t: ",table.concat(t,","))ngx.say("sorted t: ",table.concat(sorted_t,","))

显示结果如下:

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


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

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

原创粉丝点击