我正在尝试在不同的手机上测试我的NDK编程。相同的应用程序在所有其他手机上运行,但在三星4.0.2它只是停止,抛出以下错误。我错过了什么吗?任何帮助表示赞赏
10-29 12:02:57.729: E/AndroidRuntime(3626): at android.app.Activity.performCreate(Activity.java:4486)
10-29 12:02:57.729: E/AndroidRuntime(3626): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
10-29 12:02:57.729: E/AndroidRuntime(3626): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)
10-29 12:02:57.729: E/AndroidRuntime(3626): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
10-29 12:02:57.729: E/AndroidRuntime(3626): at android.app.ActivityThread.access$600(ActivityThread.java:127)
10-29 12:02:57.729: E/AndroidRuntime(3626): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
10-29 12:02:57.729: E/AndroidRuntime(3626): at android.os.Handler.dispatchMessage(Handler.java:99)
10-29 12:02:57.729: E/AndroidRuntime(3626): at android.os.Looper.loop(Looper.java:137)
10-29 12:02:57.729: E/AndroidRuntime(3626): at android.app.ActivityThread.main(ActivityThread.java:4511)
10-29 12:02:57.729: E/AndroidRuntime(3626): at java.lang.reflect.Method.invokeNative(Native Method)
10-29 12:02:57.729: E/AndroidRuntime(3626): at java.lang.reflect.Method.invoke(Method.java:511)
10-29 12:02:57.729: E/AndroidRuntime(3626): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:976)
10-29 12:02:57.729: E/AndroidRuntime(3626): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:743)
10-29 12:02:57.729: E/AndroidRuntime(3626): at dalvik.system.NativeStart.main(Native Method)
**10-29 12:02:57.729: E/AndroidRuntime(3626): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1285]: 161 cannot locate '__aeabi_idiv0'...**
10-29 12:02:57.729: E/AndroidRuntime(3626): at java.lang.Runtime.loadLibrary(Runtime.java:370)
10-29 12:02:57.729: E/AndroidRuntime(3626): at java.lang.System.loadLibrary(System.java:535)
答案 0 :(得分:5)
Android 4.0上存在一个已知错误,其中加载了本机库,这可能是导致问题的原因。如果你想深入了解细节,我在上面写了一个detailed blogpost。长话短说:
我想您尝试使用的库是针对不同的体系结构编译的(通常是armeabi和armeabi-v7a,分别存储在libs/armeabi
和libs/armeabi-v7a
中)。在Android 4.0上,System.loadLibrary()
方法搞砸了:当您尝试加载库libsomething.so
时,它不会在与设备体系结构相对应的文件夹中搜索本机库,而是加载第一个库在任何libsomething.so
子文件夹中找到名称为libs
的,可能会加载错误的体系结构,这可能会导致崩溃。
最简单的解决方法:
libsomething.so
,armeabi-v7a为libsomething-v7a.so
。这样,当使用System.loadLibrary()
时,不会因为几个文件具有相同名称而感到困惑。System.loadLibrary()
,即这两个文件名中的哪一个,您必须自己检测设备使用的体系结构。有几种方法可以做到这一点:其中一种方法是使用本地代码中的android_getCpuFeatures()
文件中的cpu-features.h
(在上面的博文中解释),另一种方法是解析系统/proc/cpuinfo
来自Java的文件(例如解释here)希望这有帮助!