記得很久以前,剛開始接觸Quick,那時候嘗試過一次這樣的操作,不過失敗了。
因為那時候還年幼,對這里面的一套機制不是太熟悉。現在回頭再做這樣的事,遇到了問題,但是都很好的根據自己的理解給解決了。
現在記錄下,我tolua成功的過程,在寫blog的過程中,更熟練其中的原理。
PS:網上關於quick tolua的blog都有點過時了(dualface的quick官網文章),具體的過程,還是要自己多注意。
我是基於Quick 2.2.1-rc版本實現的。
————————————————————————————————————————————————————————————
首先quick項目中找到:如下圖紅線框的兩個重要文件夾。
進入第一個cocos2d-x文件夾:
繼續進入一層文件夾cocos2dx,創建我們自定義的類,如下圖我紅線框住的類:
MyAdder的實現是2個整數的加法實現如下:
H文件:
1 #ifndef MY_ADDER 2 #define MY_ADDER 3 4 class MyAdder 5 { 6 public: 7 static int addTwoNumber(int a, int b); 8 }; 9 #endif
CPP文件:
1 #include "MyAdder.h" 2 3 int MyAdder::addTwoNumber(int a, int b) 4 { 5 return a+b; 6 }
創建好了以后,需要注意一點,非常重要的一點:
android.mk文件的修改:
mk文件的位置:
就是這個mk文件。
mk文件的作用是什么?簡單一句:配置需要編譯h,cpp文件,最終生成動態庫or靜態庫,android通過System.loadLibrary("game");
加載(動態庫or靜態庫)到android平台中,然后Lua腳本就可以調用什么CCSprite等等Cocos2dx的庫函數了。
所以我也需要配置我自己定義的h,cpp文件。所以:如下:
這樣,在android項目下,build_native.bat的時候,就可以把我們的類文件也編譯到libgame.so包中去了。
至於mk文件的詳細介紹,請看這里:點擊跳轉
到這里,思考下,我完成了那些步驟。
1_成功將我自己定義的類加載到了.so包中,也就是當成功加載了so包后,我定義的類也就在內存中了,但是lua怎么調用呢?
接下來需要做的事,調用我加載到內存中的so文件。
首先根據我的類創建一個tolua文件。
如何編寫tolua文件?網上有具體的規則。不會的話,可以參考別人的轉換規則。哪里看?here:
這里面都是cocos2dx中的c++文件轉換后的tolua文件,可以參考這里的。
然后如下位置創建一個MyAdder.tolua文件:
MyAdder.tolua文件的內容:
class MyAdder : public CCObject { public: static int addTwoNumber(int a, int b); };
MyAdder.tolua文件創建成功后,需要思考一下:
如何讓我定義的tolua文件可以成功的編譯到文件中呢。。。需要在上圖中的Cocos2d.tolua文件中,添加如下代碼:
好~ tolua文件也綁定成功了。開始使用tolua++的工具編譯我定義的tolua文件了。
使用tolua++的主要目的是:
生成lua到c++文件調用的中間文件,也就是:
%QUICK_COCOS2DX_ROOT%\lib\cocos2d-x\scripting\lua\cocos2dx_support\LuaCocos2d.cpp
這個具體可以看:
build.bat的實現是這樣的:
@echo off
set DIR=%~dp0
set TOLUA=%QUICK_COCOS2DX_ROOT%\bin\win32\tolua++.exe
cd /d "%DIR%"
%TOLUA% -L "%DIR%basic.lua" -o "%QUICK_COCOS2DX_ROOT%\lib\cocos2d-x\scripting\lua\cocos2dx_support\LuaCocos2d.cpp" Cocos2d.tolua
tolua的編譯參數參考(方便理解上面的編譯命令行參數):
點擊build.bat后,等待tolua++.exe編譯生成LuaCocos2d.cpp文件,執行完后,看生成的LuaCocos2d.cpp文件,
看文件里面時候有MyAdder關鍵字,如果有,則生成成功了。
生成成功后,還需要在LuaCocos2d.cpp文件中添加一行(否則會在編譯so包時報錯):
一切就緒,使用Eclipse,點擊build_native.bat編譯c++文件,這個編譯過程中,編譯了我定義的MyAdder文件,
如果自定義的文件里面有語法錯誤,或者其它的什么錯誤,這個編譯過程會中斷的。
它還會編譯個重要的cpp文件,就是:LuaCocos2d.cpp文件。記得這里面有我定義的MyAdder類么,
把LuaCocos2d.cpp文件編譯通過后,我們在lua腳本中就可以調用我自定義的類了。
整個編譯通過后,生成了so文件,~~~~~
clean project,run as android application~~~~
上真機演示效果:
忘了說我的腳本調用代碼了:
總結:
既然是Lua調用C++,需要知道:
1.創建我自己定義的h,cpp文件。
2.將上面創建的h,cpp文件能成功加載編譯到so包中,並載入程序運行的內存中(android.mk文件的增加我的類)
3.創建lua跟c++相互調用的中間API轉換文件(LuaCocos2d.cpp)
4.既然要創建LuaCocos2d.cpp文件,需要用到tolua++工具
5.既然需要用tolua++工具,就需要把自己的類的接口寫成tolua文件
6.寫好tolua文件,添加到cocos2d.tolua編譯目錄中,用來編譯生成LuaCocos2d.cpp文件
7.自動生成LuaCocos2d.cpp成功,將我的類的定義寫到LuaCocos2d.cpp文件中。( #include "MyAdder.h")
8.android Project下編譯生成so包,測試。。。
————————————————————OVER————————————————————————