【COCOS2DX-LUA 指令碼開發之十三】解決lua專案編譯Android出現get data from file failed、Cocos2dxActivity cannot be 路徑等問題
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
CCString* pstrFileContent = CCString::createWithContentsOfFile("himi.lua");
if (pstrFileContent)
{
pEngine->executeString(pstrFileContent->getCString());
}
#else
std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename("himi.lua");
pEngine->addSearchPath(path.substr(0, path.find_last_of("/")).c_str());
pEngine->executeScriptFile(path.c_str());
#endif <em id="__mceDel">
</em>
本站文章均為原創,轉載務必在明顯處註明:(作者新浪微博: @李華明Himi )
本部落格最新動態!及時將最新博文通知您!
對於跨平臺整合,Himi已經寫了1.x 與 2.x 的了,還不知道如何整合的請移步到
本篇只是解決在整合cocos2dx-lua專案會出現的幾個問題的方法。
首先需要說明的是Himi使用的Cocos2dx Version : Cocos2dx 2.1.2 hotfix
第一:關於 get data from file(xxx.lua) failed/can not get file data of xxx.lua 這個問題,如下圖:
此問題的原因是由於你自定義目錄的原因造成的,將到目錄,那麼不得不說明下,在xcode中有兩種顏色的資料夾,第一種 黃色 和 綠色
黃色資料夾:不帶路徑,直接新增到根目錄的資料夾,也就是說沒有資料夾的意思,只是將檔案新增專案中了。
綠色資料夾:真正的將資料夾新增進來,其資料夾中的每個檔案帶有路徑。如a/a.lua,是將資料夾整個新增到專案的根目錄
可能還有童鞋不是很明白上面的兩種顏色的資料夾的意思,下面舉個例子:
例如我們將一個ios專案進行打包,此ios專案的Resources新增一個叫dir的資料夾,其中dir中包括兩個lua檔案a.lua b.lua 那麼此時將dir資料夾新增進專案我們xcode專案中,肯定需要右鍵Resources資料夾“Add Files to xxx(專案名)”,然後在新視窗中選擇我們需要新增的資料夾,如下圖:
需要注意的是在下方有一個選項:
Folders :
1. Create groups for any added folders: 預設選項,將資料夾建立成一個groups形式新增
2. Create folder references for any added folders : 引用建立資料夾進行新增
使用第一種形式進行新增的資料夾是黃色,第二種形式新增的資料夾是綠色
那麼如果我們採用第一種形式將dir資料夾加入專案進行打包,那麼解壓xx.ipa後可以發現這個dir資料夾不存在的,並且dir資料夾中的檔案全部都預設放在專案根目錄中。
反之 ,如果我們採用第二種形式新增,那麼打包後的專案.ipa解壓後會看到dir檔案。
不知道這麼說大家有沒有理解,還不理解的童鞋請自行打包測試觀察!
需要注意的是!使用ndk 編譯cocos2dx-lua專案時,預設把專案下的Resources 所有資料夾和檔案都copy到android專案的assets目錄下!
下面開始講解為什麼出現 get data from file(xxx.lua) failed/can not get file data of xxx.lua
其實這個問題是android載入執行lua檔案時找不到這個檔案,說白了就是路徑不對!
舉例,如果你有一個添加了一個lua資料夾,其中包含一個黃色的himi.lua指令碼資料夾,當你執行時,程式碼一般如下:
童鞋們想一想,如上程式碼中如果是ios平臺獲取himi.lua完整路徑是不是就是根目錄下,因為這個指令碼上一層lua資料夾是個黃色資料夾!那麼在ios上執行執行肯定沒有任何問題。
但是!如果你將此段程式碼直接編譯android執行肯定出現找不到himi.lua檔案的問題,原因是你應該加上路徑,修改如上一段程式碼如下:
1234567891011 | #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) CCString* pstrFileContent = CCString::createWithContentsOfFile( "lua/himi.lua" ); if (pstrFileContent) { pEngine->executeString(pstrFileContent->getCString()); } #else std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename( "himi.lua" ); pEngine->addSearchPath(path.substr(0, path.find_last_of( "/" )).c_str()); pEngine->executeScriptFile(path.c_str()); #endif |
如上新增路徑後即可執行成功!但是!新問題又出現了,一旦你在編譯程式碼到Android後,如果有自定義的資料夾,那麼其中的每個檔案都需要路徑,這是個問題,另外如果你的一個指令碼中有require 其他指令碼,也會有問題!對不對?!
因此我們可以採取如下來完美解決:
一、 我們新增自定義指令碼資料夾,可以綠色資料夾方式新增。
二、當require 其他指令碼時,書寫完整的路徑,如:require “x.lua”
這樣我們就可以讓ios執行指令碼也需要路徑,這樣統一了android與ios載入資源的路徑問題!
執行第一個lua,示例程式碼可以如下:
12345678910111213141516 | std::string dirPath = "lua" ; #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) CCString* pstrFileContent = CCString::createWithContentsOfFile((dirPath + "/x.lua" ).c_str()); if (pstrFileContent) { pEngine->executeString(pstrFileContent->getCString()); } #else std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename((dirPath + "/x.lua" ).c_str()); pEngine->addSearchPath(path.substr(0, path.find_last_of( "/" ) - dirPath.length()).c_str()); pEngine->executeScriptFile(path.c_str()); #endif // CCDirector::sharedDirector()->runWithScene(World::scene()); return true ; } |
第二:在終端裡使用ndk編譯時出現fata error HelloWorldScene.h No such file問題 如下圖:
此問題是因為lua模板是沒有此類的,所以我們修改如下檔案:
找到你整合的android專案目錄下的jni/hellocpp/main.cpp檔案,將
#include “HelloWorldScene.h” 修改為: #include “cocos2d.h”
ok,再編譯即可。
第三:類第一個問題,編譯時出現 CCLuaEngine.h: No such file 問題,如下圖:
此問題需要修改你整合android專案下的jni/Android.mk 檔案,如下:
首先刪除 ../../Classes/HelloWorldScene.cpp
然後在 LOCAL_WHOLE_STATIC_LIBRARIES 後新增 cocos_lua_static 庫
最後新增 $(call import-module,scripting/lua/proj.android/jni)
大家可以參考引擎示例中的lua示例下的 jni/Android.mk 配置即可。其中還新增物理引擎box2d等庫等
第四:Eclipse匯入Android專案報錯 Cocos2dxActivity cannot be resolved to a type 或 The Improt org.cocos2dx.lib cannot be resolved 問題,如下圖:
這種問題是Build Path缺少檔案的link,我們配置下即可,首先右鍵專案然後選擇Properties,然後選擇“Java Build Path”,在 Source 欄目中點選“Link Source” ,如下圖:
然後會出現一個新視窗:
Linked folder location:
選擇link的檔案,其路徑指向cocos2dx引擎目錄的cocos2d-2.1rc0-x-2.1.2-hotfix/cocos2dx/platform/android/java/src 目錄即可!
Folder name :
這裡預設是src,如果報錯,我們自定義個名字即可。
設定完成後一路finish或OK儲存返回。