Android ndk 8b无法加载库

时间:2012-08-29 09:00:18

标签: android android-ndk

升级到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'

3 个答案:

答案 0 :(得分:6)

__gnu_thumb1_case_uqi是一个帮助程序,它在密集打包的交换机表上执行索引跳转;快速实现切换。您有两种选择:避免或与之链接。

如果您提高优化级别(使用-O3),则可能不需要此符号。此外,更改CPU可能有助于使用thumb2指令。使用-ffreestanding选项进行编译也可以避免使用此符号。如果您可以控制switch语句,则可以使用函数指针数组替换它。

此例程位于 libgcc 中。您可以静态链接 libgcc 。在Android SDK /编译器的某个地方,必须有libgcc.a。使用libgcc.a-L链接-l或使用-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在运行时可能没有指向正确的库集。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

Producing optimised NDK code for multiple architectures?

在上面链接中接受的答案中阅读'arm'vs'thumb'。

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

... OR

生病了......你的'Android.mk'中的链接器声明中的库顺序

尝试使用谷歌论坛获取ndk ...搜索“无法找到符号”...

真的很绝望?

请参阅“运行时错误”部分here