lua 與 C++的交互

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自動計算長度


1.2.2 Querying Elements

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 。

 1.2.3 Other Stack Operations

    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方案 

  1. 打開coredump   :  ulimit -c unlimited
  2. 編譯g++ 時 打開 -g 模式 
  3. 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

 


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章