lua 與 C++的交互
我發現踩完坑,編譯完。。 之後我就忘記了。
把儘可能記得的有點用的東西記錄下把
· debug方案
· 參考文獻
1.C++如何和lua交互
1.1 簡述
- Lua和C/c++語言通信的主要方法是一個無處不在的虛擬棧lua_State *L
- 堆棧索引的方式可是是正數也可以是負數,區別是:正數索引1永遠表示棧底,負數索引-1永遠表示棧頂
- 需要在Lua裏面調用c/c++ 的函數必須滿足以下格式:typedef int (*lua_CFunction) (lua_State *L); 即必須接收一個lua_State作爲參數,同時返回一個整數值。(表示函數返回時有多少返回值被壓入Lua棧)
- lua知道C++的函數,向lua註冊一個函數,內部實現是以函數指針的形式:lua_register(Lua, "函數名字",函數指針);
1.2 Lua棧操作
1.2.1Pushing Elements
展開源碼
void lua_pushnil (lua_State *L);
void lua_pushboolean (lua_State *L, int bool);
void lua_pushnumber (lua_State *L, double n);
void lua_pushlstring (lua_State *L, const char *s, size_t length);
void lua_pushstring (lua_State *L, const char *s); // 壓入字符串,使用strlen自動計算長度
int lua_is... (lua_State *L, int index);
注意:`lua_to***`系列函數只是讀取棧內的內容,並不會修改棧的內容
展開源碼
int lua_toboolean (lua_State *L, int index);
double lua_tonumber (lua_State *L, int index);
const char *lua_tostring (lua_State *L, int index);
size_t lua_strlen (lua_State *L, int index);
-----
lua_CFunction lua_tocfunction (lua_State *L, int index); // 把給定索引處的 Lua 值轉換爲一個 C 函數。 這個值必須是一個 C 函數;如果不是就返回 NULL 。
const void *lua_topointer (lua_State *L, int index); //把給定索引處的值轉換爲一般的 C 指針 (void*) 。 這個值可以 userdata ,table ,thread 或是一個 function ; 否則,lua_topointer 返回 NULL
void *lua_touserdata (lua_State *L, int index); //如果索引處的值是完整的 userdata ,返回內存塊的地址。 如果值是一個 light userdata ,那麼就返回它表示的指針。 否則返回 NULL 。
int lua_gettop (lua_State *L); // 該函數返回當前lua狀態棧的大小
void lua_settop (lua_State *L, int index); // 設置index位置爲棧頂,多餘元素被幹掉,出現空缺的話補nil
void lua_pushvalue (lua_State *L, int index); // 把index處值的副本壓入棧頂
void lua_remove (lua_State *L, int index); // 移除index處的值,上面的元素下移一位
void lua_insert (lua_State *L, int index); //在index處插入棧頂元素,其上的元素上移一位
void lua_replace (lua_State *L, int index); //把棧頂元素設置到index處,原值被覆蓋
void lua_pop(lua_State* lua, int count)宏,從棧中彈出count個元素,等價於lua_settop(lua, -1 - count)
--
int lua_is***(lua_State* lua, int index) 判斷lua棧中index位置的元素是否是***, 同上,不再枚舉
int lua_type(lua_State* lua, int index) 返回index位置元素的類型,具體取值範圍請參見lua.h, 如LUA_TNUMBER
const char* lua_typename(lua_State* lua, int type) // 返回type常量對應的元素類型名稱
1.3 Lua value 和 C value對應
|
c |
lua |
nil |
無 |
{value=0, tt = t_nil} |
boolean |
int 非0, 0 |
{value=非0/0, tt = t_boolean} |
number |
int/float等 1.5 |
{value=1.5, tt = t_number} |
lightuserdata |
void*, int*, 各種* point |
{value=point, tt = t_lightuserdata} |
string |
char str[] |
{value=gco, tt = t_string} gco=TString obj |
table |
無 |
{value=gco, tt = t_table} gco=Table obj |
userdata |
無 |
{value=gco, tt = t_udata} gco=Udata obj |
closure |
無 |
{value=gco, tt = t_function} gco=Closure obj |
debug方案
- 打開coredump : ulimit -c unlimited
- 編譯g++ 時 打開 -g 模式
- gbd 調試 gdb licenseCheckerSo.so core.23146
參考文獻
http://gamedevgeek.com/tutorials/calling-c-functions-from-lua/
http://acamara.es/blog/2012/08/calling-c-functions-from-lua-5-2/
https://www.cnblogs.com/sevenyuan/p/4511808.html