Cocos2d-x android项目移植——各类bug及常见问题解决方案全集

简介: 在学习IOS项目如何移植到Android的项目过程中,相信很多初学者会遇到各种各样的问题。特别是移植从事C++语言编程的。在大家学过java,考试还考的不错。

在学习IOS项目如何移植到Android的项目过程中,相信很多初学者会遇到各种各样的问题。特别是移植从事C++语言编程的。在大家学过java,考试还考的不错。但是说到jni,就直接不知道了。在移植过程中,不断的查阅资料,充实自己。逐渐熟识了jni,ADT,NDK等术语以及它们之间的关系。这些词汇具体含义都能google到。

  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 的学习之旅-----序言
相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
相关文章
|
4月前
|
Web App开发 移动开发 小程序
"项目中mpaas升级到10.2.3 适配Android 14之后 app中的H5以及小程序都访问不了,
"项目中mpaas升级到10.2.3 适配Android 14之后 app中的H5以及小程序都访问不了,显示“网络不给力,请稍后再试”,预发内网版本不能使用,线上版本可以正常使用,这个是什么原因啊,是某些参数没有配置吗,还是说是一些参数改错了?
57 2
|
2月前
|
Android开发
【Bug】Android resource linking failed和error: failed linking references.
【Bug】Android resource linking failed和error: failed linking references.
|
1月前
|
JSON Android开发 数据格式
android 使用GSON 序列化对象出现字段被优化问题解决方案
android 使用GSON 序列化对象出现字段被优化问题解决方案
|
2月前
|
Java Android开发 C++
安卓SO层开发 -- 第一个NDK项目
安卓SO层开发 -- 第一个NDK项目
16 0
|
3月前
|
IDE 开发工具 Android开发
Android Studio 下发布项目成APK文件
Android Studio 下发布项目成APK文件
117 1
|
3月前
|
JavaScript Android开发
Cordova 打包 Vue 项目到Android打开白屏
Cordova 打包 Vue 项目到Android打开白屏
|
4月前
|
开发工具 Android开发 开发者
Android 项目编译 Gradle 配置说明
Android 项目编译 Gradle 配置说明
149 0
|
4月前
|
Web App开发 JSON Android开发
【Android App】实战项目之仿微信的视频通话(附源码和演示 超详细必看)
【Android App】实战项目之仿微信的视频通话(附源码和演示 超详细必看)
82 0
|
24天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0
|
2天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
19 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库