仅限三星Galaxy 4.0.2手机,Android NDK库在运行时无法加载

4

我正在尝试在不同的手机上测试我的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)

重启手机没有帮助:\ ? - user2511414
不好意思:( 在发布这篇文章之前,我已经在两部不同的三星S1手机上尝试过了...任何帮助都将不胜感激。 - rana
1个回答

5
在Android 4.0上存在已知的本地库加载错误,这可能是您问题的原因。如果您想深入了解细节,我写了一篇详细的博客文章,请点击此处。简而言之:
我猜想你尝试使用的库是为不同的体系结构编译的(通常是armebi和armebi-v7a,分别存储在libs/armeabilibs/armeabi-v7a中)。在Android 4.0上,System.loadLibrary()方法出现了问题:当您尝试加载库libsomething.so时,它会加载任何libs子文件夹中找到的第一个名称为libsomething.so的库,可能会加载错误的架构,从而导致崩溃。
最简单的解决方法如下:
  • 根据其体系结构为库赋予不同的名称,例如armeabi的libsomething.so和armeabi-v7a的libsomething-v7a.so。这样,当使用System.loadLibrary()时,它就无法被多个文件具有相同名称的事实所困扰。
  • 完成此操作后,问题在于您必须自己检测设备使用的体系结构,即必须知道要使用System.loadLibrary()中的这两个文件名中的哪一个。有几种方法可以做到这一点:其中之一是使用来自本地代码的cpu-features.h文件中的android_getCpuFeatures()(在上面的博客文章中有解释),另一种方法是从Java中解析系统的/proc/cpuinfo文件(例如在此处有解释)。
希望这能帮助您!

1
如果您想进行快速简单的首次检查:请删除libs中不适合您设备架构的子文件夹(我看到您提到了Galaxy S1,它是armeabi-v7a),然后按照现有代码运行。如果它可以正常工作,那么很可能这就是问题所在! - mbrenon
@mbrenon,我在这里遇到了同样的问题http://stackoverflow.com/questions/22931392/run-time-error-in-native-android?noredirect=1#comment35010792_22931392,你能否指导我错在哪里!!因为我已经按照你在评论中提供的方法尝试了。 - AHF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接