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
阅读全文
0 0
- OpenResty--LUA用FFI库调用C函数实例
- FFI Library (lua 调用 c)
- 用ffi调用.dylib库
- lua的FFI库--alien
- lua的FFI库--alien
- [lua]C调用lua函数
- Lua调用C函数
- lua 调用c函数
- Lua调用C函数
- lua调用c函数
- Lua调用C函数
- lua调用C函数
- lua调用C函数
- lua调用C函数
- Lua调用C函数
- lua调用c函数
- lua调用C函数
- lua调用C函数
- Python学习(0)
- Android
- centos7 切换文本/图形界面
- sublime 快捷键收藏
- java注解详解
- OpenResty--LUA用FFI库调用C函数实例
- 1031. Hello World for U (20)
- springmvc与spring父子容器controller扫描机制
- “码工”下足笨功夫 二维码门牌更智慧
- 芯片——摩尔定律的传奇(下)
- webservice接口编写
- Django中REST风格数据传输
- web安全之CSRF
- fatal: refusing to merge unrelated histories