6

升级到 ndk 8b 我收到了一些崩溃报告(其中大多数是带有 Android 4.03 的 Galaxy SII)

java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1286]: 1836 cannot locate '__gnu_thumb1_case_uqi'...
at java.lang.Runtime.loadLibrary(Runtime.java:370)
at java.lang.System.loadLibrary(System.java:535)
at com.iuculano.fplayer.SDLActivity.void onCreate(android.os.Bundle)(SourceFile:324)
at android.app.Activity.performCreate(Activity.java:4465)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
at android.app.ActivityThread.access$600(ActivityThread.java:127)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4507)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
at dalvik.system.NativeStart.main(Native Method)

异常是由一个简单的System.loadLibrary("main");

这是什么意思?cannot locate '__gnu_thumb1_case_uqi'

4

3 回答 3

6

__gnu_thumb1_case_uqi是一个在密集的交换表上进行索引跳转的助手;快速实现切换。你有两个选择:避免它或链接它。

如果您增加优化级别(通过使用-O3),您可能不需要此符号。此外,更改 CPU 和使用thumb2指令可能会有所帮助。使用选项编译-ffreestanding也可以避免这个符号。如果您可以控制 switch 语句,则可以将其替换为函数指针数组。

该例程在libgcc中。您可以静态链接libgcc。在 Android SDK/编译器的某个地方,必须有一个libgcc.a. Link with libgcc.a, using -Land -lor use-static-libgcc链接器选项来获取代码(参见http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html)。

编辑: 如果你没有编译任何东西,那么你可以libgcc.so在你的系统上找到。对于 Android 设备,它可能在/lib或某个地方很奇怪。/usr/lib将 所在的目录添加libgcc.so到环境变量LD_LIBRARY_PATH中也可以解决问题。不幸的是,三星发布了不兼容的二进制文件,如果你不编译自己的代码,你就无法解决这个问题。正确的libgcc.so可能在/usr/lib/thumb多库发行版之类的东西中。我不太了解 Davlik 的东西,但 Android JVM 在运行时可能不会指向正确的库集。

于 2013-01-09T17:09:29.567 回答
2

你在为armv7编译吗?如果不是,请尝试为 armv7 编译。

于 2012-08-31T08:22:25.807 回答
1

为多种架构生成优化的 NDK 代码?

在上述链接中接受的答案中阅读有关“手臂”与“拇指”的信息。

然后,删除您为 thumb 构建的配置说明,并验证您正在为 arm 构建...

或者...

我会做出一个疯狂的猜测......它是您在“Android.mk”的链接器语句中的库顺序

尝试 ndk 的谷歌论坛...搜索“找不到符号”...

真的绝望吗?

请参阅此处的“运行时错误”部分

于 2012-08-31T20:56:25.687 回答