Quick-Cocos2d-x 使用tolua工具導出C++的類給Lua調用


記得很久以前,剛開始接觸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————————————————————————

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM