Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲

cocos2d

編輯:Android開發環境

       這段時間把cocos2d-x 3.4的一個測試工程編譯到Android手機上時,總出現在C++層一些莫名的錯誤,所以想調試一下到底是哪裡出了錯,用的工具是Eclipse+ADT+CDT,最後也沒弄成功,就把問題貼在這:http://www.cocoachina.com/bbs/read.php?tid=294829&page=e&#a,如果有朋友用Eclipse調試成功的,請分享一下。

       沒成功,就只能找其他方法了,終於在StackFlow上找到相關的信息:http://stackoverflow.com/questions/24334080/how-to-debug-cocos2d-x-3-native-code-on-android-device,而且信息已經比較健全了,在貼的最後提問者Narek把自己的總結也貼出來了。提問這位仁兄也是蠻不容易,用超過20天來解決這個問題,可見cocos2d-x提供的技術文檔也是不夠完善的,我也得好好感謝裡面的兩位Narek和Vikas Patidar。好吧,閒話到這,我們來看看,用ndk-gdb工具怎麼調試。

       一、確保cocos編譯環境沒問題

       1、這個cocos自身已經做得非常自動化,在cocos引擎文件夾下雙擊一個setup.py,設置好ANDROID_SDK_ROOT,NDK_ROOT,ANT_ROOT基本就可以建立好編譯環境,當然別忘了setup是用python來運行的。還用不懂就到網上找或者看cocos目錄下的README.md文件。

       2、這裡最好把NDK路徑加入到環境變量的系統路徑(即Path環境變量中)。因為本文會頻繁用到ndk-build和ndk-gdb.py(和ndk-gdb同個東西,但是也有點點區別,下文會提及)命令,把ndk路徑加入到系統路徑中也是為了好調取這兩個命令。

       二、修改Android工程文件

       這些操作都在proj.android文件進行

       1、Jni文件夾下Android.mk修改這不用說,把自己工程要編譯的寫上去。

       2、確認自己Android調試機的系統版本,從而確認自己API代號,如Narek的貼中所說, 調試機是Android 2.3.3,那麼它的API代號就是android-10,我的機器是4.03,那麼API就是android-15,這個代號可以從ADT的Andoird SDK Manager工具確認。得到這個值之後,修改一下project.properties文件,把裡面的XX修改成你的測試機的代號。

XML/HTML代碼
  1. target=android-XX  
  2. android.library.reference.1=../cocos2d/cocos/platform/android/java  

      修改這個還不夠,還有一個地方就在AndroidManifest.xml中:

XML/HTML代碼
  1. <uses-sdk android:minSdkVersion="9"/>  
  2. <uses-feature android:glEsVersion="0x00020000" />  

       把minSdkVersion項也改成調試機代號,不然一會執行ndk-gdb.py就出現以下錯誤:

XML/HTML代碼
  1. ERROR: The device does not support the application's targetted CPU ABIs!  
  2.        Device supports:  armeabi-v7a armeabi  
  3.        Package supports: Android NDK: WARNING: APP_PLATFORM android-15 is larger than android:minSdkVersion 9 in ./AndroidManifest.xml  

       這個項可以等你調試沒啥問題了,把它設置回來。

       三、編譯和運行工程

       1、打開Windows的cmd、或者Linux的shell,轉到你工程目錄下

       2、編譯工程,我這采取Narek的命令行,如果不懂cocos命令行的,參考http://blog.csdn.net/luyafei_89430/article/details/38442391

XML/HTML代碼
  1. cocos compile -p android -m debug --ndk-mode debug   

       看有沒有編譯成功,到我寫完文章,都沒有出錯過,所以有出錯疑問,可以先檢查一下cocos的環境設置,再留到評論裡探討探討。

       3、把工程運行到調試機上,也是Narek的命令行

XML/HTML代碼
  1. cocos run -p android -m debug    

       四、開始調試

       1、打開Windows的cmd、或者Linux的shell,轉到你工程目錄的proj.android下

       2、執行ndk-gdb.py命令(如果提示命令不存在,那就是你NDK在系統路徑(path)中沒設好,請自行檢查)

       NOTE:Narek用的是ndk-gdb命令,但是我後來(之前我一直也是用ndk-gdb)發現如果用ndk-gdb進入調試,會出現下方的錯誤:

XML/HTML代碼
  1. warning: unrecognized item "timeout" in "qSupported" response  
  2. Ignoring packet error, continuing...  
  3. Ignoring packet error, continuing...  
  4. Ignoring packet error, continuing...  
  5. Ignoring packet error, continuing...  

       查詢了一下,說得用ndk-gdb.py就沒問題。

       當然如果所用環境都搭建好了,不會出錯。但是這裡ndk-gdb.py還有很多命令參數,會導致啟動失敗,所以我也就介紹自己由於命令參數沒設好導致的失敗。

       首先是--adb參數,這個參數是指定adb命令的路徑。因為真機調試需要用adb命令來連接手機,所以這個參數是必須的。如果你在系統路徑中已經指定了他的路徑,那這裡不加入這個參數也可以。但如果出現以下錯誤,你就必須去指定你的adb位置或修改你的路徑

XML/HTML代碼
  1. ERROR: The 'adb' tool is not in your path.  
  2.        You can change your PATH variable, or use  
  3.        --adb=<executable> to point to a valid one.  

      這個命令的路徑一般是Android的sdk目錄中的platform-tools下,我這邊的指定如下(windows環境下):

XML/HTML代碼
  1. ndk-gdb.py --adb=E:\Android\sdk\platform-tools\adb.exe  

       這個命令很常見,很多應用都有它的存在,就是要用它來連接手機,獲取一些信息。

       第二命令是--nowait參數。因為缺少jdb調試命令,出現的錯誤為:

XML/HTML代碼
  1. ERROR: Failed to find jdb.  
  2. ..you can use --nowait to disable jdb  
  3. ..but may miss early breakpoints.  

       我們這裡只要調試C++代碼就可以,所以不用jdb,直接加上這個參數就可以了。不過有jdb的話,會有更多的信息。

       第三個命令是--force。有時候我們可能有兩個調試窗口調試應用,但是調試值允許一個窗口操作,另外一個窗口就調試不了,那此時這個命令就器作用,強制結束另外一個窗口的調試,直接用當前窗口調試。反正這個命令就是強制結束相同應用的進程。出錯信息為:

XML/HTML代碼
  1. ERROR: Another debug session running, Use --force to kill it.  

       第四個命令是可選的,--verbose,可以打印你工程的信息,調試信息,是非常有用的(之前說它沒用,真虧待了它)。

       第五個命令就是--launch。launch指定了應用入口的Activity,比如cocos2dx-3.4版本入口Activity是org.cocos2dx.cpp.AppActivity(我之前寫錯了,不是指定包的名字,sorry)

       第六個命令把我害得最苦的,--start。先說說它的用法:這個命令是直接啟動應用的命令,它自動幫你指定了入口的Activity。如果不在其目錄下,啟動不了。一般用這個命令就可以啟動程序了,但是,我發現在cocos用著命令會發現一個奇怪的問題,必須指定入口Activity而且這個問題非常隱蔽,我也是用--verbose才看出問題(所以才說它有用)。我用這個命令一直出現以下的錯誤:

XML/HTML代碼
  1. ERROR: Could not extract PID of application on device/emulator.  
  2.        Are you sure the application is already started?  
  3.        Consider using --start or --launch=<name> if not.  

       結果我用--verbose,看到了以下信息

XML/HTML代碼
  1. Android NDK installation path: E:/Android/android-ndk-r10d  
  2. Using specific adb command: E:\Android\sdk\platform-tools\adb.exe  
  3. ADB version found: Android Debug Bridge version 1.0.32  
  4. Using ADB flags:  
  5. Using auto-detected project path: .  
  6. Found package name: com.cocos.test  
  7. ABIs targetted by application: armeabi  
  8. Device API Level: 15  
  9. Device CPU ABIs: armeabi-v7a armeabi  
  10. Compatible device ABI: armeabi  
  11. Using gdb setup init: ./libs/armeabi/gdb.setup  
  12. Using toolchain prefix: E:/Android/android-ndk-r10d/toolchains/arm-linux-androideabi-4.8/prebuilt/windows/bin/arm-linux-  
  13. androideabi-  
  14. Using app out directory: ./obj/local/armeabi  
  15. Found debuggable flag: true  
  16. Found device gdbserver: /data/data/com.cocos.test/lib/gdbserver  
  17. Found data directory: '/data/data/com.cocos.test'  
  18. Found first launchable activity: .org.cocos2dx.cpp.AppActivity  
  19. Launching activity: com.cocos.test/.org.cocos2dx.cpp.AppActivity  
  20. ## COMMAND: adb_cmd shell am start -D -n com.cocos.test/.org.cocos2dx.cpp.AppActivity  
  21. ## COMMAND: adb_cmd shell sleep 2.000000  
  22. Found running PID: 0  

       這。。。。,入口函數裡面多了個點(Found first launchable activity: .org.cocos2dx.cpp.AppActivity)。我想爆粗口:@#¥%#。我不知道怎麼解釋這個問題。。,所以我在這必須指定入口Activity了。

       其他的命令我也沒一一去研究,畢竟可以達到調試目的就可以了。

       最終我的命令就是(懶人可以復制修改):

XML/HTML代碼
  1. ndk-gdb.py --adb=adb路徑\adb.exe --force --nowait --verbose --launch=org.cocos2dx.cpp.AppActivity  

       NOTE:這裡一個錯誤(我沒遇到過)要提一提。回到Narek的文章中,Narek執行了ndk-gdb後出現這樣子的錯誤:

XML/HTML代碼
  1. Nareks-MacBook-Pro:jni Narek$ ndk-gdb  
  2. jni/Android.mk:67: *** Android NDK: Aborting.    .  Stop.  
  3. ERROR: The device does not support the application's targetted CPU ABIs!  
  4.        Device supports:  armeabi-v7a armeabi  
  5.        Package supports: Android NDK:   

       自己覺得這個有點像第二大點中沒設置好工程文件的的API代號,這我也不敢斷定,既然作者說了,那也寫出來,好給有問題的人一點提示。但自己做了一些測過,但大部分資料來自他的原文。

       如果你在jni文件夾中執行(這個命令應該是顯示你編譯的平台):

XML/HTML代碼
  1. ndk-build DUMP_APP_ABI  

       正常的話應該是出現你編譯的平台名字,如

XML/HTML代碼
  1. armeabi  

       但Narek就出現如下的錯誤

XML/HTML代碼
  1. Nareks-MacBook-Pro:jni Narek$ ndk-build DUMP_APP_ABI  
  2. Android NDK: /Users/Narek/NoorGames/Games/test2/proj.android/jni/Android.mk: Cannot find module with tag '.' in import path  
  3. Android NDK: Are you sure your NDK_MODULE_PATH variable is properly defined ?  
  4. Android NDK: The following directories were searched:  
  5. Android NDK: /Users/Narek/NoorGames/Games/test2/proj.android/jni/Android.mk:67: *** Android NDK: Aborting. . Stop.  

       由於Vikas Patidar建議Narek用ndk-build DUMP_APP_ABI打印平台信息,從而查出NDK_MODULE_PATH沒有設定,所以V就成N的救星。

       那麼NDK_MODULE_PATH是在哪裡?如果執行第三大步的第2小步命令,當命令執行不久,就可以看到NDK_MODULE_PATH的設置了

XML/HTML代碼
  1. Runing command: compile  
  2. Building mode: debug  
  3. building native  
  4. NDK build mode: NDK_DEBUG=1  
  5. The Selected NDK toolchain version was 4.8 !  
  6. running: '/Users/Narek/NoorGames/android-ndk-r9d/ndk-build -C /Users/Narek/NoorGames/Games/test2/proj.android -j1 <strong>NDK_MODULE_PATH</strong>=/Users/Narek/NoorGames/Games/test2/proj.android/../cocos2d:/Users/Narek/NoorGames/Games/test2/proj.android/../cocos2d/cocos:/Users/Narek/NoorGames/Games/test2/proj.android/../cocos2d/external'  

       如果屏幕滾得太快,可以用鍵盤的pause(break)鍵來暫停,Enter可以繼續。

       這個變量可以以環境變量添加到編譯選項裡,也可以直接添加到jni的Android.mk文件中,Narek把加到mk文件樣板給貼出來了:

XML/HTML代碼
  1. NDK_MODULE_PATH := $(LOCAL_PATH)/../../../../cocos  
  2. NDK_MODULE_PATH += $(LOCAL_PATH)/../../../../external  

       當然這也僅供參考,具體還得看你自己的工程的NDK_MODULE_PATH是怎樣的。

       3、開始GDB

       只要出現(gdb)字樣,那麼接下去的事就是看你gdb基礎扎不扎實。

       五、注意和提醒

       1、在這裡提醒一下,Narek文中叫我們要注意兩個文件夾是否存在這些文件:

        proj.android/libs/armeabi文件夾下:gdb.setup, gdbserver, libcocos2dcpp.so

        proj.android/obj/local/armeabi(作者的路徑是proj.android/jni/obj/local/armeabi,我的是這個):app_process, gdb.setup, libc.so, linker

       第一個文件夾下的文件是在第三點第2步自動生成的,只要用了debug模式。

       第二個文件夾好像是執行了ndk-gdb.py後自動生成的。

       反正我這邊這些文件都是自動生成的,但既然作者說了,大家也就檢查一下。

       2、這個方法應該都可以使用到cocos2d-x3.x的版本。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved