Lua与C语言间的交互实例
Lua是一门轻巧、灵活、扩展性很强的脚本语言,它可以很容易的嵌入到其他语言(C/C++)中使用,这主要得益于其提供了功能强大的CAPI,这让其跟C/C++间的互调成为一件很轻松的事。
Lua调用C
Lua调用C函数,其实就是把C函数注册到Lua中去,把C函数地址传递给Lua解释器。这个传递是要遵循一个的协议的,即:
typedefint(*lua_CFunction)(lua_State*L)
Lua和C是通过栈(State)来交互的,Lua调用C函数时,首先Lua把数据拷贝到栈上,然后C从栈上获取数据,调用结束后将返回结果放到栈中。栈中的每个数据通过索引值进行定位,索引值为正时表示相对于栈底的偏移索引,索引值为负时表示相对于栈顶的偏移索引,索引值以1或-1为起始值,因此栈顶索引值永远为-1,栈底索引值永远为1。栈相当于数据在Lua和C之间的中转站,每一个C函数都有自己的独立的私有栈。
利用Lua提供的CAPI,调用C函数很简单,例如下面例子:
#include<math.h> #include"lua.h" #include"lualib.h" #include"lauxlib.h" staticintl_sin(lua_State*L) { doubled=luaL_checknumber(L,1); lua_pushnumber(L,sin(d)); return1; } staticconststructluaL_Regmylib[]={ {"lsin",l_sin}, {NULL,NULL} }; intluaopen_mylib(lua_State*L) { luaL_openlib(L,"mylib",mylib,0); return1; }
把上面代码编译成一个静态资源的so文件,加入把上面代码保存在一个名为mylib.c的文件下,把它编译成一个名为libmylib.so的静态资源文件里,gcc编译语句如下:
gccmylib.c-fPIC-shared-olibmylib.so
把上面代码放在LUA_CPATH目录下(LUA_CPATH目录位置说明详看《Lua学习笔记(4)--模块与包》,这里就不多说了)。
把libmylib.so资源文件加载到模块目录下后,就可以在Lua代码里直接加载require进来使用,例如如下使用:
require"mytestlib" print(mylib1.lsin(10))