原文鏈接: http://www.cnblogs.com/zouzf/p/4202537.html
先說windows下的,mac下的在最后
環境:win8.1、java 1.5、Eclipse 4.3.1、ADT bundle 22.6.2.v20140321、NDK r8e、cocos2dx 2.2.3
前提:下載好cocos2dx、NDK(r8e以上版本可以不裝cygwin) 、ADT bundle(帶Eclipse、sdk等各種插件),配置好 JAVA_HOME、CLASSPATH、NDK_ROOT、ANDROID_SDK等環境變量;配置好Cocos2dx的Android開發環境,即可以通過ndk-build編譯cocos2dx的工程生成 .so文件、生成生成jar包、能成功運行HelloCpp工程。注意:所有涉及到的目錄不要有中文或者空格!
1、把Eclipse的workSpace目錄里的 .metadata 文件刪除,恩,Eclipse我設置了不自動build~~ 然后打開Eclipse把cocos2dx工程(Q:\cocos2d-x-2.2.3\cocos2dx\platform\android)和HelloCpp工程(Q:\cocos2d-x-2.2.3\samples\Cpp\HelloCpp\proj.android)導進去:File->import->Android->Existing Android Code Into WorkSpace->next<在Root Directory里填上cocos2dx工程所在的目錄,按回車鍵,cocos2dx的工程就出現,並且會自動選上,點finish,搞定。同樣,也把HelloCpp工程導進去。
2、TestCpp工程報錯說不認識bash :Error: Program "bash" not found in PATH
解決:(1):給Eclipse配置好NDK路徑
(2):設置TestCpp項目的C/C++ builder :ndk-build.cmd NDK_DEBUG=1 。注意:NDK_DEBUG=1 等號左右不要留有空格
3、build一下TestCpp工程,會報錯:
1 D:/new_soft/android-ndk-r8e/build/core/add-application.mk:128: Android NDK: WARNING: APP_PLATFORM android-9 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml
把工程里的AndroidManifest.xml文件里<uses-sdk android:minSdkVersion="8"/>的8改成9。查了一下文章,說這是NDK的一個bug:AndroidManifest.xml里的minSdkVersion設置不能小於項目用於編譯的SDK版本,而HelloCpp項目用於編譯的sdk版本是 2.2.3.。。。也就是 sdkversion 是 9.。。。。
4、刷新,再build,還報錯:
1 jni/Android.mk:19: *** Android NDK: Aborting. . Stop. 2 Android NDK: jni/Android.mk: Cannot find module with tag 'cocos2dx' 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:
說的是Android.mk文件里的19行 找不到 cocos2dx,大概意思是找不到這個cocos2dx這個模塊,類似於#include頭文件時要加上對應的搜索路徑的意思,那就補上這個模塊的上一層目錄:打開Android.mk文件,在最后一行$(call import-module,cocos2dx) 之前加上一行: $(call import-add-path,Q:/cocos2d-x-2.2.3)。也就是加上cocos2dx這個文件夾所在的目錄給mk文件去搜索。
注意里面的反斜杠:我們直接從windows下拷貝路徑時 是 Q:\cocos2d-x-2.2.3的,要把 \ 改成 / 。如果你的cocos2dx工程所在的目錄比較深,有很多層,要把路徑里所有的 \ 都改成 / 。
5、刷新,再build,還報錯:
1 Android NDK: Q:/cocos2d-x-2.2.3/cocos2dx/Android.mk: Cannot find module with tag 'libjpeg' in import path 2 Q:/cocos2d-x-2.2.3/cocos2dx/Android.mk:175: *** Android NDK: Aborting. . Stop. 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:
恩,同樣的錯誤,說的cocos2dx工程的Android.mk文件的175行上找不到 libjepg,注意,cocos2dx工程的mk文件不在它的工程目錄下,而是在它的上兩層,在 Q:/cocos2dx-2.2.3/cocos2dx 下面,打開它,在175行的$(call import-module,libjpeg)之前插入一句: $(call import-add-path,Q:/cocos2d-x-2.2.3/cocos2dx/platform/third_party/android/prebuilt)。注意斜杠轉成反斜杠! 因為libjepg是第三方庫,放在cocos2dx\platform\third_party\android\prebuilt這個目錄里的。
注意:第4、5步添加 ndk module 時都是用了絕對路徑,在不同電腦上都要重新配置一下。你也可以改成相對路徑,可惜我還不太熟悉mk文件的一些東西,以后再改~~
6、再build,嗯,好像成功了,成功生成了libhellocpp.so文件~~看到libs文件夾下生成了一個gdbserver文件和gdb.setup文件沒,就是因為上面設置 NDK_DEBUG=1 所以生成的,gdbserver會被部署到手機里。當觸發C++斷點時,相當於手機端的gdbserver是服務端,會發送一些信息到Eclipse這邊,Eclipse這邊的gbdserver是客戶端,Eclipse這邊的gdbserver接收到信息就進行相關操作,嗯,我猜的~~
下面說的是如何調試cpp文件
1、右鍵cocos2dx工程,選擇 Android tools -> Add Native Support,so文件的名字不用改,點finish
2、刷新,build cocos2dx工程,報錯:
D:/new_soft/android-ndk-r8e/build/core/add-application.mk:128: Android NDK: WARNING: APP_PLATFORM android-9 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml
把工程里的AndroidManifest.xml里 <uses-sdk android:minSdkVersion="8"/> 的 8 改成 9
3、刷新,build cocos2dx工程,沒報錯了,再build HelloCpp工程,也沒報錯了
4、加入需要調試的C++文件:
(1):右鍵 hellocpp工程,new->folder
(2):選中HelloCpp,下面點 advanced,選擇最后一個選項:Link to alternate location(Linked Folder),在下面輸入要導進來的cpp所在的目錄(這里我填了 Q:\cocos2d-x-2.2.3\samples\Cpp\HelloCpp\Classes),點 finish即可:
注意:文件夾名 不能和工程里已有的文件同名。
5、打開剛才加進來的CCNode.cpp文件,發現里面一大堆錯誤,包括各種#include的.h文件找不到,各種不能識別的符號或者各種 unknown symbol~~,我猜這個問題是因為只導入少數幾個cpp文件,這幾個cpp文件依賴的其他的cpp文件沒有加進來的原因,如果把所有cpp文件都加進來估計是可以的,我沒試過~~(因為libcocos2dx工程在目錄cocos2dx下面,不能直接把cocos2dx這個目錄加進來,要把里面的CocosDenshion、extensions等目錄一個個加進來~~)
解決方法:右鍵cocos2dx工程,屬性,C/C++ General->Code Analysis,選擇 使用項目設置,然后把下面的勾都去掉,如下:
6、刷新,再build兩個項目,應該都沒有問題了
7、在剛才加進來的隨便一個cpp文件里斷點,右鍵選擇HelloCpp工程,debug as->android native application(請用真機調試,用模擬器的話不知道有啥問題不),居然報錯:
8、原來是assert文件夾里的資源沒有,可能也是相對路徑又問題引起的吧,沒有把Resources里的資源拷過來吧,把Q:\cocos2d-x-2.2.3\samples\Cpp\HelloCpp\Resources里的所有東西拷到Q:\cocos2d-x-2.2.3\samples\Cpp\HelloCpp\proj.android\assets下,再跑,debug as->android native application,成功!
注意:調試C++的時候,gdbServer會有所延遲(大概有好幾秒,和你的電腦和調試的手機的性能有關吧),所以你的斷點最好不要加在程序啟動的那些代碼里,上面截圖就是加在一個菜單的點擊事件里的,點擊關閉菜單時觸發。
線程、單步、變量觀察~~perfect~~
有些時候報以下形式的 Unknow Application ABI 錯誤:
這個折騰了我許久許久。。。但偏偏今晚不能重現,這種問題其實在上面已經涉及到了的,只不過這種log的形式很迷惑人,看到紅色框沒,只要豎着讀就很清晰了:Android NDK warning:App_Platform android-14 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml .......是不是很熟悉~~~~~~有一些找不到module的如Cannot find module with tag 'cocos2dx' in import path 錯誤也會以這種形式報錯,哎,坑爹
PS:因為我用的Eclipse加了個漢化包。。。但又想在文章涉及到Eclipse設置的一些東西盡量用英文版的。。。所有有些地方用文字說的和截圖的有所差別,見諒~~
發布release版本時記得把工程屬性里配置的 NDK_DEBUG=1去掉~~
感覺這個東西的重點就在於了解Android.mk文件吧,把里面的配置看懂,在這過程中看報什么錯,就對應修改就是了。反正暫時我還是不怎么了解,所以文章里充滿了大量的我猜等字眼~~先用着,再研究吧
mac下也差不多是這個步驟,如果大家有什么問題的話,把詳細信息貼出來,我盡量把我知道的分享出來~~
mac下明明配置了NDK_ROOT,Eclipse運行的時候一直說找不到:直接在對應工程的mk文件的首行設置 NDK_ROOT="~~~~~~~~~~" (~~~表示你的ndk所在的目錄,如: D:/new_soft/android-ndk-r8e)
原文鏈接: http://www.cnblogs.com/zouzf/p/4202537.html