Android NDK 库不会仅在三星 Galaxy 4.0.2 手机的运行时加载
Android NDK library is not loading on runtime for samsung galaxy 4.0.2 phones only
我正在尝试在不同的手机上测试我的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)
Android 4.0 上有一个已知的错误,加载本机库可能是导致您问题的原因。如果你想深入了解细节,我写了一篇详细的博客文章。长话短说:
我想您尝试使用的库是为不同的架构编译的(通常是 armeabi 和 armeabi-v7a,分别存储在 libs/armeabi
和 libs/armeabi-v7a
中)。在 Android 4.0 上,System.loadLibrary()
方法搞砸了:当您尝试加载库libsomething.so
时,它不是在与设备架构对应的文件夹中搜索本机库,而是加载第一个库的名称libsomething.so
在任何libs
子文件夹中找到的名称,可能会加载错误的架构, 这可能会导致这样的崩溃。
最简单的解决方法:
- 根据库的体系结构为其指定不同的名称,例如 armeabi 的
libsomething.so
和 armeabi-v7a 的libsomething-v7a.so
。这样,当使用System.loadLibrary()
,它不会因为多个文件具有相同名称的事实而混淆。 - 完成此操作后,问题是您必须知道要加载这两个文件名中的哪一个
System.loadLibrary()
,即您必须自己检测设备使用的架构。有几种方法可以做到这一点:其中一种是使用本机代码中cpu-features.h
文件中的android_getCpuFeatures()
(在上面的博客文章中进行了解释),另一种是从 Java 解析系统/proc/cpuinfo
文件(例如,如此处所述)
希望这有帮助!
相关文章:
- std::原子加载和存储都需要吗
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 为什么加载SDF会导致Mobilizer创建闭环错误
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- 如何使用tinyxml2从XML加载父实体和子实体
- 如何在C++中使用pybind11加载一个pickle python列表
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- Python ctypes:不会按预期加载 dll
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 保存/加载大量短数组到二进制文件
- 使用 SDL2 和SDL_image C++加载图像
- 无法使用加载库卸载注入的 dll (C++)
- 是否有原子加载非原子值的函数?
- 将 bmp 文件加载到 TSpeedButton 中
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- Android NDK 库不会仅在三星 Galaxy 4.0.2 手机的运行时加载