【问题标题】:Cocos2dx: dlopen failed: cannot locate symbol "atof" referenced by "libcocos2dcpp.so"Cocos2dx:dlopen 失败:找不到“libcocos2dcpp.so”引用的符号“atof”
【发布时间】:2015-04-27 00:33:22
【问题描述】:

我正在尝试在 android 设备上运行我的 cocos2d-x 游戏,它在 android 5.0(lollipop) 上运行良好,但在较低的 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 失败: 找不到符号“libcocos2dcpp.so”引用的“atof”... 02-25 10:41:09.817: W/dalvikvm(18090): 异常 Ljava/lang/UnsatisfiedLinkError;初始化 Lcom/example/game/game 时抛出; 02-25 10:41:09.817: W/dalvikvm(18090): 类初始化在 newInstance 调用中失败 (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: 线程以未捕获的异常退出 (group=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): 在 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): 在 java.lang.Class.newInstanceImpl(Native Method) 02-25 10:41:09.827: E/AndroidRuntime(18090): 在 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): 在 java.lang.reflect.Method.invokeNative(Native Method) 02-25 10:41:09.827: E/AndroidRuntime(18090): 在 java.lang.reflect.Method.invoke(Method.java:525) 02-25 10:41:09.827: E/AndroidRuntime(18090): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739) 02-25 10:41:09.827: E/AndroidRuntime(18090): 在 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。

【问题讨论】:

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


【解决方案1】:

我说对了,我当前的环境是 cocos2d-x 3.3、NDKr10d、ADT 包 (update24)

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

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

【讨论】:

    【解决方案2】:

    尝试添加

    APP_PLATFORM := android-19 
    

    作为 Appication.mk 的第一行

    【讨论】:

    • 谢谢,这解决了我的问题。我认为更好的选择是添加 APP_PLATFORM := android-xx ,其中 xx 是您的应用所针对的 minSdkVersion。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      尝试使用android NDK r9d。对于cocos2dx ,Android NDK r9d 很好用。

      【讨论】:

        【解决方案5】:

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

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

        您是否尝试在 Application.mk 中进行设置:

        APP_PLATFORM := android-9
        

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

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

        【讨论】:

          猜你喜欢
          • 2016-11-15
          • 1970-01-01
          • 1970-01-01
          • 2017-02-19
          • 2017-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-14
          相关资源
          最近更新 更多