天天看點

【COCOS2DX-LUA 腳本開發之十三】解決COCOS2DX-LUA編譯到ANDROID找不到CCLUAENGINE、HELLOWORLD或出現GET DATA FROM FILE(XXX.LUA) FAILED/CAN NOT GET FILE DATA OF XXX.LUA、COCOS2DX

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

【COCOS2DX-LUA 腳本開發之十三】解決COCOS2DX-LUA編譯到ANDROID找不到CCLUAENGINE、HELLOWORLD或出現GET DATA FROM FILE(XXX.LUA) FAILED/CAN NOT GET FILE DATA OF XXX.LUA、COCOS2DX

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

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

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

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

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

【COCOS2DX-LUA 腳本開發之十三】解決COCOS2DX-LUA編譯到ANDROID找不到CCLUAENGINE、HELLOWORLD或出現GET DATA FROM FILE(XXX.LUA) FAILED/CAN NOT GET FILE DATA OF XXX.LUA、COCOS2DX

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

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

1

2

3

4

5

6

7

8

9

10

11

#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

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

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

    ccstring* pstrfilecontent = ccstring::createwithcontentsoffile("lua/himi.lua");

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

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

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

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

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

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

12

13

14

15

16

std::string dirpath = "lua";

    ccstring* pstrfilecontent = ccstring::createwithcontentsoffile((dirpath + "/x.lua").c_str());

    if (pstrfilecontent)

    {

        pengine->executestring(pstrfilecontent->getcstring());

    }

    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());

//    ccdirector::shareddirector()->runwithscene(world::scene());

    return true;

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

【COCOS2DX-LUA 腳本開發之十三】解決COCOS2DX-LUA編譯到ANDROID找不到CCLUAENGINE、HELLOWORLD或出現GET DATA FROM FILE(XXX.LUA) FAILED/CAN NOT GET FILE DATA OF XXX.LUA、COCOS2DX

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

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

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

ok,再編譯即可。

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

【COCOS2DX-LUA 腳本開發之十三】解決COCOS2DX-LUA編譯到ANDROID找不到CCLUAENGINE、HELLOWORLD或出現GET DATA FROM FILE(XXX.LUA) FAILED/CAN NOT GET FILE DATA OF XXX.LUA、COCOS2DX

此問題需要修改你整合android項目下的jni/android.mk 檔案,如下:

首先删除      ../../classes/helloworldscene.cpp

然後在  local_whole_static_libraries 後添加 cocos_lua_static 庫

最後添加 $(call import-module,scripting/lua/proj.android)

大家可以參考引擎示例中的lua示例下的  jni/android.mk  配置即可。其中還添加實體引擎box2d等庫等

    第四:eclipse導入android項目報錯 cocos2dxactivity cannot be resolved to a type 或 the improt org.cocos2dx.lib cannot be resolved 問題,如下圖:

【COCOS2DX-LUA 腳本開發之十三】解決COCOS2DX-LUA編譯到ANDROID找不到CCLUAENGINE、HELLOWORLD或出現GET DATA FROM FILE(XXX.LUA) FAILED/CAN NOT GET FILE DATA OF XXX.LUA、COCOS2DX

這種問題是build path缺少檔案的link,我們配置下即可,首先右鍵項目然後選擇properties,然後選擇“java build path”,在 source 欄目中點選“link source” ,如下圖:

【COCOS2DX-LUA 腳本開發之十三】解決COCOS2DX-LUA編譯到ANDROID找不到CCLUAENGINE、HELLOWORLD或出現GET DATA FROM FILE(XXX.LUA) FAILED/CAN NOT GET FILE DATA OF XXX.LUA、COCOS2DX

然後會出現一個新視窗:

linked folder location:

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

 folder name :

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

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

【COCOS2DX-LUA 腳本開發之十三】解決COCOS2DX-LUA編譯到ANDROID找不到CCLUAENGINE、HELLOWORLD或出現GET DATA FROM FILE(XXX.LUA) FAILED/CAN NOT GET FILE DATA OF XXX.LUA、COCOS2DX

繼續閱讀