cocos2d-x游戏新项目中搭android的在jni调用是出现以下问题:
1.Cocos2dxRenderer中的 调用jni接口Cocos2dxRenderer.nativeOnResume()时挂了,提示的错误是:Cocos2dxRenderer_nativeOnResume UnsatisfiedLinkError
第一步,看看Java_org_cocos2dx_lib_Cocos2dxRenderer.cpp是否被编译成目标文件.o,在libarmeabi.a中是可以很清晰地看到这个Java_org_cocos2dx_lib_Cocos2dxRenderer.o。因此这个是存在的。
第二步,已知这个文件中另外一个jni调用的本地方法nativeInit,但这个方法在main.cpp中被定义;在代码中是能被正常调用的;把这个定义的方法挪到文件Java_org_cocos2dx_lib_Cocos2dxRenderer.cpp中,代码调用时也是挂了。
第三步,有可能这个文件没有被链接如动态库中,但是这个.o文件确实在libarmeabi.a中,在最后被连接入游戏的动态库中。
第四步,基于以上的试验结果,有可能是这个目标文件.o最后被优化,并没有被链接入游戏的动态库中。试验可以在Java_org_cocos2dx_lib_Cocos2dxRenderer.cpp定义一个函数,注意这个方法不在extern“C”中,然后为不被优化掉,因此在main.cpp调用这个函数,这样应该就不会被优化。代码一跑,终于好了。。。
第五步,jni中还有文件TouchesJni.cpp也一样是被优化了,没有最后链接入游戏的动态库了。
本文解决了一个Cocos2dx项目中JNI调用失败的问题,详细介绍了定位问题的过程,包括检查目标文件的存在性、尝试不同方法来确定是否被正确链接以及如何避免被优化器移除。

8577

被折叠的 条评论
为什么被折叠?



