lua中调用C

  1. 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错误

  1. C从lua调用的C代码获取参数和返回值
    参数: 如果Lua代码在调用时传递的参数,1表示Lua调用时的第一个参数(从左到右),依此类推。luaL_checknumber、luaL_checkstring可以获得参数
    返回值入栈:lua_pushnumber、lua_pushstring、lua_pushlstring;并且需要返回返回值的数目
  2. 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

posted on 2015-02-05 13:06  Tonystz  阅读(260)  评论(0编辑  收藏  举报