Cocos2dx:dlopen失败:无法找到“libcocos2dcpp.so”引用的符号“atof”

时间:2015-02-25 05:29:41

标签: android cocos2d-x cocos2d-x-2.x

我正在尝试在Android设备上运行我的cocos2d-x游戏,它在Android 5.0(棒棒糖)上完美运行,但在较低的Android版本上崩溃。我收到以下错误:

02-25 10:41:09.787:E / ResourceType(18090):0x5ad385b8:无法ResTable :: remove()cookie = 0x3,而不是最后一个表。 mHeaders.size()= 4.警告垃圾收集器运行时发生自发崩溃。 02-25 10:41:09.797:E / asset(18090):删除运行时外观资源时出错(cookie 0x3) 02-25 10:41:09.797:I / asset(18090):删除所有运行时外观资源时出现问题 02-25 10:41:09.817:D / dalvikvm(18090):尝试加载lib /data/app-lib/com.example.game-2/libcocos2dcpp.so 0x418c9ce8 02-25 10:41:09.817:E / dalvikvm(18090): dlopen(“/ data / app-lib / com.example.game-2 / libcocos2dcpp.so”)失败:dlopen失败:找不到符号“atof”由“libcocos2dcpp.so”引用...... 02-25 10:41:09.817:W / dalvikvm(18090):Exception Ljava / lang / UnsatisfiedLinkError;在初始化Lcom / example / game / game时抛出; 02-25 10:41:09.817:W / dalvikvm(18090):在initInstance调用中类init失败(Lcom / example / game / game;) 02-25 10:41:09.817:D / AndroidRuntime(18090):关闭VM 02-25 10:41:09.817:W / dalvikvm(18090):threadid = 1:线程退出未捕获异常(组= 0x415af8b0) 02-25 10:41:09.827:E / AndroidRuntime(18090):致命异常:主要 02-25 10:41:09.827:E / AndroidRuntime(18090):java.lang.UnsatisfiedLinkError:dlopen失败:无法找到“libcocos2dcpp.so”引用的符号“atof”... 02-25 10:41:09.827:E / AndroidRuntime(18090):在java.lang.Runtime.loadLibrary(Runtime.java:361)示例 02-25 10:41:09.827:E / AndroidRuntime(18090):at java.lang.System.loadLibrary(System.java:525) 02-25 10:41:09.827:E / AndroidRuntime(18090):at com.example.game.game。(game.java:126) 02-25 10:41:09.827:E / AndroidRuntime(18090):at java.lang.Class.newInstanceImpl(Native Method) 02-25 10:41:09.827:E / AndroidRuntime(18090):at java.lang.Class.newInstance(Class.java:1130) 02-25 10:41:09.827:E / AndroidRuntime(18090):在android.app.Instrumentation.newActivity(Instrumentation.java:1061) 02-25 10:41:09.827:E / AndroidRuntime(18090):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2178) 02-25 10:41:09.827:E / AndroidRuntime(18090):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2311) 02-25 10:41:09.827:E / AndroidRuntime(18090):在android.app.ActivityThread.access $ 600(ActivityThread.java:149) 02-25 10:41:09.827:E / AndroidRuntime(18090):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1293) 02-25 10:41:09.827:E / AndroidRuntime(18090):在android.os.Handler.dispatchMessage(Handler.java:99) 02-25 10:41:09.827:E / AndroidRuntime(18090):在android.os.Looper.loop(Looper.java:137) 02-25 10:41:09.827:E / AndroidRuntime(18090):在android.app.ActivityThread.main(ActivityThread.java:5214) 02-25 10:41:09.827:E / AndroidRuntime(18090):at java.lang.reflect.Method.invokeNative(Native Method) 02-25 10:41:09.827:E / AndroidRuntime(18090):at java.lang.reflect.Method.invoke(Method.java:525) 02-25 10:41:09.827:E / AndroidRuntime(18090):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:739) 02-25 10:41:09.827:E / AndroidRuntime(18090):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 02-25 10:41:09.827:E / AndroidRuntime(18090):at dalvik.system.NativeStart.main(Native Method)。

我正在使用 cocos2d-x v2.2.6,Eclipse-Luna和android NDK r10d。

5 个答案:

答案 0 :(得分:5)

尝试添加

APP_PLATFORM := android-19 

作为Appication.mk的第一行

答案 1 :(得分:1)

尝试使用android NDK r9d。对于cocos2dx,Android NDK r9d很适合工作。

答案 2 :(得分:1)

(我知道这个重复了m0mus在解决方案中的早期答案,但我认为更全面的解释会有所帮助。)

谷歌已经将一些C标准库函数(如atof())从头文件中的内联函数转移到普通函数。最新的NDK将默认构建.so,它仅与在设备的标准C库(libc.so)中具有atof()函数的最新Android设备兼容。这意味着如果您在具有较旧版本C库的旧设备上运行库,则在加载dll时会出现错误,因为预期的atof()函数将不存在。

您是否尝试在Application.mk中设置此项:

APP_PLATFORM := android-9

这将使ndk编译器构建与旧版Android兼容的代码。

您还可以尝试将NDK安装降级到版本10b(此版本在更改之前,其中atof从内联移动到libc的一部分,因此完全避免了问题。)

答案 3 :(得分:0)

我说得对,我目前的环境是cocos2d-x 3.3,NDKr10d,ADT捆绑(update24)

 log("This is A TEst for ATOF ,%f ", std::atof("1.0"));

尝试在符号中包含_GXX_EXPERIMENTAL_CXX0X_,将值留空

答案 4 :(得分:0)

在Android Studio中,您必须手动设置NDK。 转到项目的local.properties文件,并将ndk.dir值设置为ndk目录。