在学习IOS项目如何移植到Android的项目过程中,相信很多初学者会遇到各种各样的问题。特别是移植从事C++语言编程的。在大家学过java,考试还考的不错。但是说到jni,就直接不知道了。在移植过程中,不断的查阅资料,充实自己。逐渐熟识了jni,ADT,NDK等术语以及它们之间的关系。这些词汇具体含义都能google到。
- 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
- 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
- 当使用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
- 在使用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 - 在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
- 在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
- 如要想要在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/
- 另外推荐一个学习jni的好教程-基于 Android NDK 的学习之旅-----序言