安卓NDK 8b无法加载库

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");引起的。

这是什么意思?无法定位 '__gnu_thumb1_case_uqi'


请使用V=1运行您的ndk-build,并将链接步骤的命令行发布出来。 - Alex Cohn
你是否遇到过使用操作系统不等于4.0.3的设备出现问题? - Supahfly
嗨,我遇到了同样的问题,在加载SQLiteDatabase.loadLibs(this)时抛出异常。这在Android 4.2及更高版本中运行良好,但在HTC One V设备上(v4.0.3)无法正常工作,请帮忙! - Zoombie
3个回答

6
__gnu_thumb1_case_uqi 是一个助手,它在密集的跳转表上执行索引跳转;快速实现 switch 循环。你有两个选择:避免使用它或者链接它。
如果增加优化级别(使用-O3),你可能不需要这个符号。此外,更改 CPU 可能会有帮助,以及使用thumb2 指令。使用 -ffreestanding 选项进行编译也可能避免使用该符号。如果你可以控制 switch 语句,可以将其替换为函数指针数组。
此程序位于 libgcc 中。你可以静态链接 libgcc。在 Android SDK/compiler 中,必须有一个 libgcc.a。使用 -L-l 链接 libgcc.a,或使用 -static-libgcc 链接选项来获取代码(见http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html)。 编辑: 如果你没有编译任何东西,则可以在系统中找到 libgcc.so。它可能在 /lib/usr/lib 或者对于 Android 设备来说是某个奇怪的地方。将 libgcc.so 所在的目录添加到环境变量LD_LIBRARY_PATH中也可能解决该问题。如果你没有编译自己的代码,那么三星公司发布了不兼容的二进制文件,你就无法解决这个问题。正确的 libgcc.so 可能在多库分发中类似于 /usr/lib/thumb 的某个地方。我对 Davlik 系统不是很了解,但 Android JVM 运行时可能没有指向正确集合的库。

这对我还没有解决问题,但无论如何这是很好的信息... - Nathan Monteleone
不幸的是,NDK 在其任何库中都没有导出 __gnu_thumb1_case_uqi - Alex Cohn
NDK本身可能使用的是“bionic”;一个Google libc,因此libgcc.so可能不是问题,但某些“bionic”库版本可能不包括它,可能需要使用旧版NDK进行构建以避免该符号。我认为在“bionic”中函数与glibc相同;一个switch语句。 - artless noise

2

您是否正在编译armv7?如果没有,请尝试编译armv7。


我也在为armv7编译,但我真的不明白你为什么要提到Necessitas Qt Creator。 - Giuseppe
1
因为我犯了一个错误,很抱歉 :-) 我把这个问题和另一个使用Qt Creator的问题混淆了。无论如何,当我尝试在armv7设备上加载为armv5编译的库时,我遇到了完全相同的问题。编译为armv5使其完美地工作,所以我没有进一步调查,但我认为这可能有所帮助。 - Luca Carlon

1

如何为多个架构生成优化的NDK代码?

请阅读上面链接中被接受的答案中关于“arm”与“thumb”的内容。

然后,删除您的配置指令以便为arm构建并验证您是否正在为arm构建...

或者...

我猜...可能是您在'Android.mk'链接器语句中的库顺序问题。

尝试在Google NDK论坛中搜索“无法定位符号”...

真的很绝望吗?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接