【问题标题】:Android NDK library is not loading on runtime for samsung galaxy 4.0.2 phones only仅适用于三星 Galaxy 4.0.2 手机的 Android NDK 库不会在运行时加载
【发布时间】:2013-10-29 19:20:32
【问题描述】:

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

【问题讨论】:

  • 重启手机没有帮助 :\ ?
  • Nopes :( 在这里发帖之前我尝试了两部不同的三星 S1 手机.. 任何帮助表示赞赏

标签: java android c++ c android-ndk


【解决方案1】:

在 Android 4.0 上存在一个加载原生库的已知错误,这可能是您的问题的原因。如果您想深入了解细节,我在上面写了detailed blogpost。长话短说:

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

最简单的解决方法:

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

希望这会有所帮助!

【讨论】:

  • 如果您想进行第一次快速简便的检查:删除 libs 中不适合您设备架构的子文件夹(我看到您谈论 Galaxy S1,它是 armeabi -v7a),并立即运行您的代码。如果它有效,那么您很有可能确实是问题所在!
  • @mbrenon 我在这里面临同样的事情http://stackoverflow.com/questions/22931392/run-time-error-in-native-android?noredirect=1#comment35010792_22931392 你能指导我哪里做错了吗!正如我尝试了您在评论中建议的方式
猜你喜欢
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 2013-02-21
  • 2019-02-10
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多