4

我正在尝试在不同的手机上测试我的 NDK 编程。相同的应用程序在所有其他手机上运行,​​但在 samsung 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)
4

1 回答 1

5

在 Android 4.0 上存在一个已知的带有本地库加载的错误,这可能是您的问题的原因。如果你想深入了解细节,我写了一篇详细的博文。长话短说:

我猜您尝试使用的库是为不同的架构编译的(通常是 armeabi 和 armeabi-v7a,分别存储在libs/armeabi和中libs/armeabi-v7a)。在 Android 4.0 上,该System.loadLibrary()方法搞砸了:当您尝试加载 library 时libsomething.so,它不是在与设备架构对应的文件夹中搜索本机库,而是加载libsomething.so它在任何子libs文件夹中找到的第一个具有名称的库,可能会加载错误的架构,可能导致这样的崩溃。

最简单的解决方法:

  • 根据它们的体系结构为库赋予不同的名称,例如libsomething.soarmeabi 和libsomething-v7a.soarmeabi-v7a。这样,在使用时System.loadLibrary(),就不会因为多个文件具有相同的名称而感到困惑。
  • 完成此操作后,问题是您必须知道要使用这两个文件名中的哪一个来加载System.loadLibrary()您必须自己检测设备使用的架构。有几种方法可以做到这一点:其中一种是使用android_getCpuFeatures()来自cpu-features.h本机代码的文件(在上面的博文中解释),另一种是/proc/cpuinfo从 Java 解析系统文件(例如,如here所述)

希望这可以帮助!

于 2013-10-30T11:49:57.713 回答