升级到ndk 8b i时会收到一些崩溃报告(其中大部分是galaxy sii和android 4.03)
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'
最佳答案
__gnu_thumb1_case_uqi
是一个帮助器,它在密集压缩的交换表上执行索引跳转;快速实现交换。你有两个选择:避免它或与它联系。
如果增加优化级别(使用-O3
),则可能不需要此符号。此外,更改CPU可能有助于使用thumb2
指令。使用-ffreestanding
选项编译也可以避免使用此符号。如果您可以控制switch语句,则可以用函数指针数组替换它。
这个例程在libgcc中。可以静态链接libgcc。在android sdk/编译器的某个地方,必须有一个libgcc.a
。使用libgcc.a
和-L
链接,或使用-l
链接器选项获取代码(请参见http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html)。
编辑:如果您没有编译任何东西,那么您可以在系统上找到-static-libgcc
。它可能在libgcc.so
或/lib
中,也可能是一些对android设备来说很奇怪的地方。将/usr/lib
所在的目录添加到环境变量libgcc.so
中也可以解决问题。三星发布了不兼容的二进制文件,如果不编译自己的代码,您可能无法解决这个问题,这可能是不幸的。正确的LD_LIBRARY_PATH
可能在多lib分布的libgcc.so
内部。我不太了解davlik,但是android jvm在运行时可能没有指向正确的库集。