Quick-cocos2d-x-2.2.6-release 兼容安卓5.0的一个解决方案

我司自研的游戏《挂机传说》采用了 quick-cocos2d-x-2.2.6-release,基于 NDK r9c。
日前发现在安卓5.0系统上一运行就出现闪退情况。
在 ADT 上调试,出现报错信息是“Failed to find class of ”。
报错的模块是 http 部分。

而我司另一款采用了 quick 3.5 的游戏则运行正常。
初步定位是JNI模块有问题,考虑到 quick 3.5 的是正常的,
因此对比了quick两个版本相应的代码文件的差异。
由于 quick 2.2.6 与 quick 3.5 的文件目录差别很大,
这部分代码的目录位置需要手工定位。
对比后发现 quick 3.5 的 JniHelper 实现更为合理,及更为通用,
因此把 JniHelper 代码手工同步到 2.2.6 版本上。

接下来修改 CCHTTPRequestAndroid.cpp
此部分代码也基本与 quick 3.5 的同步,
但差异是 2.2.6 采用 CC 类名前缀,而 3.5 是改用名字空间。
主要是把此文件中的 getStaticMethodInfo 改为用 JniHelper::getStaticMethodInfo

改完 http 部分后,发现 CCLuaJavaBridge.cpp 也有同样问题,
按照上述部分,也是把 getStaticMethodInfo 改为用 JniHelper::getStaticMethodInfo

通过分析 3.5 的机制,要让上述修改生效,还需要修改 Java_org_cocos2dx_lib_Cocos2dxHelper.cpp
加上以下方法
JNIEXPORT void JNICALL Java_org_cocos2dx_lib_Cocos2dxHelper_nativeSetContext(JNIEnv* env, jobject thiz, jobject context) {
JniHelper::setClassLoaderFrom(context);
}

最后需要修改一个JAVA文件 Cocos2dxHelper.java
加上以上文件的函数声明
private static native void nativeSetContext(final Context pContext);
并且在初始化时加上
Cocos2dxHelper.nativeSetContext((Context)pContext);

自此,修改完毕,重新编译 libgame.so 后,重新打包,功能正常

由于时间关系,最后用代码说话,我修改过的代码,都在附件中,有需要的同行可以下载对比原有文件的差异

楼主V5~~~~~~~~~~~

牛逼顶个楼主

可以往 https://github.com/chukong/quick-cocos2d-x 提交 pr 啊

感谢楼主分享。。。。。。

dsafdafdfdfdfdafd

我也遇到这个问题,换上楼主的方案试试,成功了会回来跟帖报告疗效.

哦擦,果然好了.楼主英明神武!

顶起来!!!!

我2.2.3根本没有那几个CPP:3: