天天看點

【COCOS2DX-LUA 腳本開發之十三】解決lua項目編譯Android出現get data from file failed以及路徑等問題

對于跨平台整合,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  這個問題,如下圖:

<a href="http://www.himigame.com/wp-content/uploads/2013/04/QQ20130423-9.png"></a>

此問題的原因是由于你自定義目錄的原因造成的,将到目錄,那麼不得不說明下,在xcode中有兩種顔色的檔案夾,第一種 黃色 和 綠色 

黃色檔案夾:不帶路徑,直接添加到根目錄的檔案夾,也就是說沒有檔案夾的意思,隻是将檔案添加項目中了。

     綠色檔案夾:真正的将檔案夾添加進來,其檔案夾中的每個檔案帶有路徑。如a/a.lua,是将檔案夾整個添加到項目的根目錄

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

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

<a href="http://www.himigame.com/wp-content/uploads/2013/04/QQ20130423-8.png"></a>

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

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腳本檔案夾,當你執行時,代碼一般如下:

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) 

    CCString* pstrFileContent = CCString::createWithContentsOfFile("himi.lua"); 

if (pstrFileContent) 

 { 

 pEngine-&gt;executeString(pstrFileContent-&gt;getCString()); 

 } 

#else 

 std::string path = CCFileUtils::sharedFileUtils()-&gt;fullPathForFilename("himi.lua"); 

 pEngine-&gt;addSearchPath(path.substr(0, path.find_last_of("/")).c_str()); 

 pEngine-&gt;executeScriptFile(path.c_str()); 

#endif &lt;em id="__mceDel"&gt; 

&lt;/em&gt; 

童鞋們想一想,如上代碼中如果是ios平台擷取himi.lua完整路徑是不是就是根目錄下,因為這個腳本上一層lua檔案夾是個黃色檔案夾!那麼在ios上執行運作肯定沒有任何問題。

    但是!如果你将此段代碼直接編譯android運作肯定出現找不到himi.lua檔案的問題,原因是你應該加上路徑,修改如上一段代碼如下:

    CCString* pstrFileContent = CCString::createWithContentsOfFile("lua/himi.lua"); 

 if (pstrFileContent) 

#endif 

   如上添加路徑後即可運作成功!但是!新問題又出現了,一旦你在編譯代碼到Android後,如果有自定義的檔案夾,那麼其中的每個檔案都需要路徑,這是個問題,另外如果你的一個腳本中有require 其他腳本,也會有問題!對不對?!

         是以我們可以采取如下來完美解決:

           一、 我們添加自定義腳本檔案夾,可以綠色檔案夾方式添加。

          二、當require 其他腳本時,書寫完整的路徑,如:require “x.lua”

這樣我們就可以讓ios運作腳本也需要路徑,這樣統一了android與ios加載資源的路徑問題!

運作第一個lua,示例代碼可以如下:

std::string dirPath = "lua"; 

    CCString* pstrFileContent = CCString::createWithContentsOfFile((dirPath + "/x.lua").c_str()); 

    if (pstrFileContent) 

    { 

        pEngine-&gt;executeString(pstrFileContent-&gt;getCString()); 

    } 

    std::string path = CCFileUtils::sharedFileUtils()-&gt;fullPathForFilename((dirPath + "/x.lua").c_str()); 

    pEngine-&gt;addSearchPath(path.substr(0, path.find_last_of("/") - dirPath.length()).c_str()); 

    pEngine-&gt;executeScriptFile(path.c_str()); 

#endif  

//    CCDirector::sharedDirector()-&gt;runWithScene(World::scene()); 

    return true; 

 第二:在終端裡使用ndk編譯時出現fata error HelloWorldScene.h No such file問題 如下圖:

<a href="http://www.himigame.com/wp-content/uploads/2013/04/QQ20130422-1.png"></a>

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

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

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

ok,再編譯即可。

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

<a href="http://www.himigame.com/wp-content/uploads/2013/04/QQ20130423-3.png"></a>

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

<a href="http://www.himigame.com/wp-content/uploads/2013/04/QQ20130423-4.png"></a>

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

<a href="http://www.himigame.com/wp-content/uploads/2013/04/QQ20130423-5.png"></a>

然後會出現一個新視窗:

Linked folder location:

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

 Folder name :

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

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

<a href="http://www.himigame.com/wp-content/uploads/2013/04/QQ20130423-6.png"></a>

本文轉自 xiaominghimi 51CTO部落格,原文連結:http://blog.51cto.com/xiaominghimi/1184710,如需轉載請自行聯系原作者

繼續閱讀