Call C from Lua(在Lua中调用C动态库函数)
- C函数原型满足:typedef int (lua_CFunction) (lua_State L);
该函数类型仅仅包含一个表示Lua环境的指针作为其唯一的参数,实现者可以通过该指针进一步获取Lua代码中实际传入的参数
返回值: 返回结果的个数(returns the number of results);没有返回值时,返回0 注册C函数: void lua_register (lua_State L,const char name,lua_CFunction f);
解释:Lua环境指针L;Lua中可见的函数名name;C中的函数指针f注册C函数库:void luaL_register (lua_State L,const char libname,const luaL_Reg *l);
加载C动态库过程:require(XXX)
解释:查找动态库XXX.so;执行动态库中的函数是luaopen_XXX完成注册动态库生成命令gcc -Wall -shared -fPIC -o XXX.so -llua
如果出现自定义C函数与lua中的函数重名,则会出现lua C stack overflow错误
- C函数原型满足:typedef int (lua_CFunction) (lua_State L);
- C从lua调用的C代码获取参数和返回值
参数: 如果Lua代码在调用时传递的参数,1表示Lua调用时的第一个参数(从左到右),依此类推。luaL_checknumber、luaL_checkstring可以获得参数
返回值入栈:lua_pushnumber、lua_pushstring、lua_pushlstring;并且需要返回返回值的数目 - userdata:
void*lua_newuserdata (lua_State *L, size_t size); //full userdata 是一片原始的内存区
void lua_pushlightuserdata (lua_State *L, void*p); //light userdata 是一个表示C指针的值,void *类型
void *lua_touserdata(lua_State *L, int index); //假如给定的索引位置是full userdata,则返回内存块地址;假如给定的索引位置是light userdata,则返回指针,否则返回NULL