- 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完成註冊ui
- 動態庫生成命令gcc -Wall -shared -fPIC -o XXX.so -llua
若是出現自定義C函數與lua中的函數重名,則會出現lua C stack overflow錯誤
- 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