Android NDK库仅在运行时未加载三星galaxy 4.0.2手机

ran*_*ana 4 c c++ java android android-ndk

我试图在不同的手机上测试我的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)
Run Code Online (Sandbox Code Playgroud)

mbr*_*non 5

Android 4.0上存在一个已知错误,其中加载了本机库,这可能是导致问题的原因.如果你想深入了解细节,我会在上面写一篇详细的博文.长话短说:

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

最简单的解决方法:

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

希望这可以帮助!