2012-08-29 39 views
6

升级到NDK 8B我收到了一些崩溃报告(其中大多数是GALAXY SII采用Android 4.03)的Android NDK 8B无法加载库

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'

+0

请运行您的ndk-build V = 1并发布命令行链接步骤 –

+0

您是否遇到过使用OS!= 4.0.3的设备的问题? – Supahfly

+0

嗨,我面临同样的问题,我加载SQLiteDatabase.loadLibs(这),它引发了我关于异常。在Android 4.2及更高版本中可以正常工作,但不适用于具有v4.0.3的HTC one V设备,请帮忙! – Zoombie

回答

2

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

+0

我正在编译armv7,我真的不明白为什么你写了关于Necessitas Qt Creator的文章 – Giuseppe

+1

因为我犯了一个错误,抱歉:-)我把这个问题与Qt Creator的另一个问题混淆了。无论如何,当我尝试在armv7设备上加载为armv5编译的库时,我遇到了同样的问题。为armv5编译使其工作完美,所以我没有进一步调查,但我认为这可能会有所帮助。 –

1

Producing optimised NDK code for multiple architectures?

阅读有关 'ARM' VS在上面的链接接受的答案 '拇指'。

然后卸下你的配置指令,建立拇指和验证您正在为手臂...

或者......

生病做胡乱猜测......它的库顺序你在接头语句进行“Android.mk”

尝试谷歌论坛NDK ...搜索“无法找到符号” ......

真的绝望了?

参见“运行时错误”部分here

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。它可能在/lib/usr/lib中,或者对于Android设备来说可能有些奇怪。将libgcc.so所在的目录添加到环境变量LD_LIBRARY_PATH也可以解决该问题。可能不幸的是,三星发布了不兼容的二进制文件,如果您没有编译自己的代码,则无法解决问题。正确的libgcc.so可能在/usr/lib/thumb之内用于多lib分发。我对Davlik的东西了解不多,但Android JVM在运行时可能没有指向正确的库集。

+0

这还没有解决我的问题,但它是好信息... –

+0

不幸的是,NDK不会在任何库中导出__gnu_thumb1_case_uqi。 –

+0

NDK本身可能使用'仿生';一个谷歌libc,所以libgcc.so可能不是问题,但一些'仿生'库版本不包括它,可能你将不得不建立一个较旧的NDK没有符号。我认为这个函数和glibc在'仿生'中是一样的;一个switch语句。 –