轉載 Cocos2d-x android項目移植——各種bug及常見問題解決方案全集

在學習IOS項目如何移植到Android的項目過程當中,相信不少初學者會遇到各類各樣的問題。特別是移植從事C++語言編程的。在你們學過 java,考試還考的不錯。可是說到jni,就直接不知道了。在移植過程當中,不斷的查閱資料,充實本身。逐漸熟識了jni,ADT,NDK等術語以及它們 之間的關係。這些詞彙具體含義都能google到。 html

  1. Cocos2d-x 2.0.4版本的CCBReader代碼,在xCode 4.6版本編譯後,讀取ccbi文件出錯。緣由是xCode 4.6版本編譯使用的ARM指令集,在內存對齊這塊有點特殊。解決方法:將readHead(),readFloat()函數中強制轉換成float*代 碼註釋掉,使用unsigned char*去保存地址。
    參考帖子:http://www.cocos2d-x.org/boards/6/topics/18183

  2. Cocos2d-x 2.0.4版本的android項目工程搭建後,沒法在模擬器中調試。主要緣由有兩點:
    1.模擬器沒有開啓使用GPU Emulation。
    2.android版本Cocos2d-x,檢查模擬器是否支持OpenGLES 2.0的代碼有點問題。
    對應解決方法:
    1.開啓GPU Emulation功能,在新的模擬器(個人是基於Android4.2版本的模擬器)中關於GPU的全部設置改成了【Use Host GPU】複選框。舊模擬器的好像在硬件設置裏面直接能找到GPU Emulation設置。
    2.在Cocos2dxActivity.java的onCreateView()函數的
    gLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer());
    代碼以前加入一行新代碼
    gLSurfaceView.setEGLConfigChooser(8 , 8, 8, 8, 16, 0);
    具體新加的代碼什麼含義本人不清楚(本人大學一直學的DirectX,沒有摸過OpenGL,之後確定要買點OpenGL的經典原著看看)。
    參考帖子:http://www.cocos2d-x.org/boards/6/topics/12563

  3. 當使用ndk-r8d版本,且使用eclipse編譯代碼C++代碼的時候,可能會報出error: cant run because this: APP_PLATFORM android-9 is larger than android:minSdkVersion 8 in AndroidManifest.xml.其實這只是個NDK的警告,可是eclipse卻把它做爲error處理。解決方法:在eclipse的項目【C/C++ Builder】中的build命令中追加NDK_NO_WARNINGS=1
    參考帖子:http://quirkygba.blogspot.com/2012/11/two-problems-with-android-ndk-r8c.html

  4. 在使用eclipse的CDT(C++ Development tools)編譯時,可能會出現提示please define NDK_ROOT,而且不能運行程序。
    解決方法:右擊項目-》【Property】-》【C/C++ Builder】-》【environment]中添加一個環境變量:name:NDK_ROOT,value:你的ndk根路徑
    參考帖子:http://www.cnblogs.com/young40/archive/2012/10/19/cocos2d-x-mac-os-x-android-xcode-ios-development-setup.html

  5. 在android的移植中,咱們可能會用到jni。那麼咱們就確定須要有jni類對應的 C/C++頭文件,通常使用javah命令能夠生成。可是不少簡單的教程使用javah命令,根本就不行。今天從網上查資料,通常須要先將android 程序編譯一遍,這樣每一個類就有了.class文件,而後咱們到工程目錄的【bin/classes】目錄下,執行下述命令:javah com.example.jni_test.Nadd。咱們須要到 bin/classes目錄下面,以便javah能夠搜索類文件,後面的類名,必定要加上包名。
    參考帖子:http://www.apkstory.com/development/javah-generate-jni-header-file.html

  6. 在android的移植中,若是想在jni對應的C/C++實現函數中打印信息,請不要使用printf,這個根本無論用。通常使用 __android_log_print(ANDROID_LOG_DEBUG,「main",「print in android");第二個參數是輸出信息的類別標籤,第三個參數是要輸出的信息。須要包含頭文件#include <android/log.h>。
    參考帖子:http://stackoverflow.com/questions/10274920/how-to-get-printf-messgaes-written-in-ndk-application/10275209#10275209

  7. 如要想要在C++中調用Java類方法,那麼咱們須要作哪些呢?首先就是得到JNIEnv* env,而後經過env獲取類id(即jclass類型),而後經過env和類id,能夠獲取方法id(jmethodID)和字段 id(jfieldID)。有了這些,咱們就能夠調用通常方法(Call*Method)和靜態方法(CallStatic*Method),調用通常方 法須要傳入對象id(即一個jobject對象),調用靜態方法須要傳入類id(無需對象id)。另外咱們得到的這些jmethodID和 jfieldID可能須要調用DeleteLocalRef函數進行銷燬。
    參考帖子:http://hubingforever.blog.163.com/blog/static/171040579201221553444677/

  8. 另外推薦一個學習jni的好教程-基於 Android NDK 的學習之旅-----序言
相關文章
相關標籤/搜索