【问题标题】:Android ndk 8b Cannot load libraryAndroid ndk 8b 无法加载库
【发布时间】:2023-03-16 16:30:01
【问题描述】:

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

【问题讨论】:

  • 请使用 V=1 运行 ndk-build 并发布链接步骤的命令行
  • 您对 OS != 4.0.3 的设备有任何问题吗?
  • 嗨,我面临同样的问题,我正在加载 SQLiteDatabase.loadLibs(this) 并且它向我抛出异常。在 Android 4.2 及更高版本中运行良好,但在具有 v4.0.3 的 HTC one V 设备中无法运行,请帮助!!

标签: android android-ndk


【解决方案1】:

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

【讨论】:

  • 我也在为armv7编译,我真的不明白你为什么写Necessitas Qt Creator
  • 因为我犯了一个错误,抱歉 :-) 我把这个问题与另一个使用 Qt Creator 的问题混淆了。无论如何,在尝试在 armv7 设备上加载为 armv5 编译的库时,我遇到了同样的问题。为 armv5 编译使其完美运行,因此我没有进一步调查,但我认为它可能会有所帮助。
【解决方案2】:

Producing optimised NDK code for multiple architectures?

在上述链接中接受的答案中了解“手臂”与“拇指”。

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

或者...

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

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

真的很绝望吗?

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

【讨论】:

    【解决方案3】:

    __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 的内部,用于多库分发。我对 Davlik 的东西了解不多,但 Android JVM 在运行时可能不会指向正确的库集。

    【讨论】:

    • 这还没有解决我的问题,但它仍然是很好的信息......
    • 很遗憾,NDK 不会在其任何库中导出 __gnu_thumb1_case_uqi
    • NDK 本身可能正在使用“仿生”;一个谷歌 libc,所以 libgcc.so 可能不是问题,但是一些不包含它的“仿生”库版本,可能您必须使用较旧的 NDK 构建才能没有该符号。我认为“仿生”中的功能与 glibc 相同;一个 switch 语句。
    猜你喜欢
    • 2013-07-12
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多