Intereting Posts

Android NDK-библиотека не загружается во время выполнения только для телефонов samsung galaxy 4.0.2

Я пытаюсь проверить свое программирование 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) 

Известная ошибка на Android 4.0 с загрузкой загружаемых библиотек, которая может быть причиной вашей проблемы. Я написал подробный блог-пост, если вы хотите погрузиться в детали. Короче:

Я предполагаю, что библиотека, которую вы пытаетесь использовать, скомпилирована для разных архитектур (обычно armeabi и armeabi-v7a, соответственно хранящихся в libs/armeabi и libs/armeabi-v7a ). В Android 4.0 метод System.loadLibrary() libsomething.so : при попытке загрузить библиотеку libsomething.so вместо поиска собственной библиотеки в папке, соответствующей архитектуре устройства, загружает первую библиотеку с именем libsomething.so он находит в любой libsomething.so libs , потенциально загружая неправильную архитектуру, что может вызвать такой крах.

Простейшее обходное решение:

  • Дайте разные имена библиотекам в зависимости от их архитектуры, например libsomething.so для armeabi и libsomething-v7a.so для armeabi-v7a. Таким образом, при использовании System.loadLibrary() его не смущает тот факт, что несколько файлов имеют одинаковое имя.
  • Как только это будет сделано, проблема в том, что вы должны знать, какой из этих двух имен файлов загружать с помощью System.loadLibrary() , т. Е. Вы должны самостоятельно определить архитектуру, используемую устройством. Существует несколько способов сделать это: один из них – использовать android_getCpuFeatures() из файла cpu-features.h из собственного кода (поясняется в приведенном выше блоге), другой – проанализировать файл system /proc/cpuinfo с Java (Например, как объяснено здесь )

Надеюсь это поможет!