1. 程式人生 > >【COCOS2DX-LUA 指令碼開發之十三】解決lua專案編譯Android出現get data from file failed、Cocos2dxActivity cannot be 路徑等問題

【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  這個問題,如下圖:

QQ20130423-9

此問題的原因是由於你自定義目錄的原因造成的,將到目錄,那麼不得不說明下,在xcode中有兩種顏色的資料夾,第一種 黃色 和 綠色 

黃色資料夾:不帶路徑,直接新增到根目錄的資料夾,也就是說沒有資料夾的意思,只是將檔案新增專案中了。

     綠色資料夾:真正的將資料夾新增進來,其資料夾中的每個檔案帶有路徑。如a/a.lua,是將資料夾整個新增到專案的根目錄

可能還有童鞋不是很明白上面的兩種顏色的資料夾的意思,下面舉個例子:

例如我們將一個ios專案進行打包,此ios專案的Resources新增一個叫dir的資料夾,其中dir中包括兩個lua檔案a.lua b.lua 那麼此時將dir資料夾新增進專案我們xcode專案中,肯定需要右鍵Resources資料夾“Add Files to xxx(專案名)”,然後在新視窗中選擇我們需要新增的資料夾,如下圖:

QQ20130423-8

需要注意的是在下方有一個選項:

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());}#elsestd::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,示例程式碼可以如下:

12345678910111213141516std::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());}#elsestd::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問題 如下圖:

QQ20130422-1

此問題是因為lua模板是沒有此類的,所以我們修改如下檔案:

找到你整合的android專案目錄下的jni/hellocpp/main.cpp檔案,將

#include “HelloWorldScene.h”  修改為: #include “cocos2d.h”

ok,再編譯即可。

第三:類第一個問題,編譯時出現 CCLuaEngine.h: No such file 問題,如下圖:

QQ20130423-3

此問題需要修改你整合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 問題,如下圖:

QQ20130423-4

這種問題是Build Path缺少檔案的link,我們配置下即可,首先右鍵專案然後選擇Properties,然後選擇“Java Build Path”,在 Source 欄目中點選“Link Source” ,如下圖:

QQ20130423-5

然後會出現一個新視窗:

Linked folder location:

選擇link的檔案,其路徑指向cocos2dx引擎目錄的cocos2d-2.1rc0-x-2.1.2-hotfix/cocos2dx/platform/android/java/src 目錄即可!

 Folder name :

這裡預設是src,如果報錯,我們自定義個名字即可。

設定完成後一路finish或OK儲存返回。

QQ20130423-6