我司自研的游戏《挂机传说》采用了 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 后,重新打包,功能正常
由于时间关系,最后用代码说话,我修改过的代码,都在附件中,有需要的同行可以下载对比原有文件的差异
