1、lua綁定到C++,就是C++能調用到lua的東西,那必須讓C++知道有哪些lua函數或變量可以用
2、C++綁定到lua,就是lua能調用到C++的東西,當然也必須讓lua知道有哪些C++東東可以給lua調用,所謂的“暴露”
這裏說的綁定就是第2種情況,在lua中能調用到Cocos2dx的函數。
Cocos2dx通過工程裏面的tools/toLua工具生成註冊C++函數到lua的函數cpp文件
二、環境設置
工具:
cocos2dx 3.8.1
NDK_ROOT 必須爲android-ndk-r9d 64bit版Python 爲32bit版,2.7.3版(因爲有個插件是32位的(Cheetah),如果這個插件有64的,個人覺得用python64位沒問題)
python插件:Cheetah、PyYAML(3.10以上版本、有32、64可選,但現在必選32)
PS:安裝必要的庫和工具包,以及配置相關環境變量,請按照cocos2d-x-3.0rc0\tools\tolua\README.mdown說得去做,不做贅述。
-----------------------------------------綁定環境配置好之後測試--------------------------------------------
1.創建純cocos2dx lua工程:cocos new LuaTest -p com.chiu.hellolua -l lua -d D:\XXXXX ,將2dx sdk下的tools文件夾拷至LuaTest frameworks cocos2d-x 下,原本生成的項目該文件夾是不全的,沒有綁定的腳本等等。
2.編寫測試Cpp類TestCpp
3.編寫綁定腳本genbindings.py(可重命名)和.ini配置
a.tolua++ 工具的路徑:tolua_root = '%s/tools/tolua' % project_root 運行腳本放到tools文件夾下此處不用修改
b.輸出綁定生成文件(.cpp和.hpp)路徑(根據需要修改,此處是我自己的):‘%s/tests/lua-empty-test/project/Classes/auto’ % project_root
c.修改cmd_args參數:第一個參數是ini文件名(我的是'testCpptoLua.ini'),第二個參數包含兩部分,第一部分對應ini文件首行內容,如[cocos2dx].一般是第一行,形如 我的參數cmd_args={'testCpptoLua':('testCpptoLua','lua_testCpptoLua_auto')},含義就是查找testCpptoLua.ini中的[testCpptoLua]字段配置,最後生成的.hpp .cpp以 lua_testCpptoLua_auto命名。如果第二個參數對應不上,會出現Section not found in configfile的錯誤。
d..ini文件的修改:prefix 關係到lua函數開頭的名字,如此處我測試用例則寫prefix=testCpptoLua. 那麼上述所說綁定生成的.hpp .cpp則以lua_testCpptoLua開頭。另 外,ini還需修改的字段是headers, 即爲需要綁定生成的C++類頭文件地址,如我寫的:headers = %(cocosdir)s/../Classes/TestCpp.h , 也就是放在工程Classes文件 夾下。最後修改的字段爲classes, 也就是你綁定的C++類名,如我的寫:classes = TestCpp. 注意PS:headers和classes配置多個類,headers用%字符連接.h, classes用*連接多個類名 ,有多個就寫多少個
4.當前目錄下運行cmd,並執行腳本命令: python genbindings.py,如出現bindings succeeds說明生成成功。如提示Fails,則說明失敗,根據錯誤提示修改.py 或者 .ini配置文件
5.將生成的lua_testCpptoLua_auto.hpp lua_testCpptoLua_auto.cpp 以及原C++ TestCpp.h TestCpp.cpp四個文件拷貝到Classes目錄下(當然地址可以隨意放置,只需在工程添加正確的引用位置即可),並添加四個文件到工程Classes下
6.註冊TestCpp類接口給lua
在需要使用TestCpp的地方添加頭文件:
<span style="font-family:Microsoft YaHei;font-size:14px;">#include "lua_testCpptoLua_auto.hpp"</span>
註冊TestCpp類:<span style="font-family:Microsoft YaHei;font-size:14px;">register_all_testCpptoLua(stack->getLuaState());</span>
6.在lua代碼中加入測試調用TestCpp的方法,純lua的cocos2dx 工程可以看到Appdelegate是執行了engine->executeScriptFile("src/main.lua"),所以在main.lua下加入測試代碼即可:
local function main()
require("app.MyApp"):create():run()
local test = TestCpp:create("GuoKun Chiu");
test:printCurName();
end
7.測試結果會打印出:TestCpp success,cur name is GuoKun Chiu