Почему на эмуляторе armeabi-v7a установлена ​​библиотека x86 вместо библиотеки armeabi-v7a?

Чтобы представить мою проблему, у меня есть приложение, использующее NDK, скомпилированное только для ABI "armeabi-v7a" и "x86". Итак, компиляция дает мне:

Android NDK: WARNING: APP_PLATFORM android-17 is larger than android:minSdkVersion 10 in /home/**********/AndroidManifest.xml
[armeabi-v7a] Gdbserver      : [arm-linux-androideabi-4.9] libs/armeabi-v7a/gdbserver
[armeabi-v7a] Gdbsetup       : libs/armeabi-v7a/gdb.setup
[x86] Gdbserver      : [x86-4.9] libs/x86/gdbserver
[x86] Gdbsetup       : libs/x86/gdb.setup
[armeabi-v7a] Install        : libNativeFFMPEG.so => libs/armeabi-v7a/libNativeFFMPEG.so
[armeabi-v7a] Install        : libavcodec-56.so => libs/armeabi-v7a/libavcodec-56.so
[armeabi-v7a] Install        : libavutil-54.so => libs/armeabi-v7a/libavutil-54.so
[armeabi-v7a] Install        : libswscale-3.so => libs/armeabi-v7a/libswscale-3.so
[x86] Install        : libNativeFFMPEG.so => libs/x86/libNativeFFMPEG.so
[x86] Install        : libavcodec-57.so => libs/x86/libavcodec-57.so
[x86] Install        : libavutil-55.so => libs/x86/libavutil-55.so
[x86] Install        : libswscale-4.so => libs/x86/libswscale-4.so

Моя проблема может быть обозначена этим предупреждением? (Это не одна и та же версия библиотеки ffmpeg для двух целевых ABI, но я не думаю, что это проблема)

Затем я создаю эмулятор с CPU/ABI = (ARM) armeabi-v7a, и моя библиотека не загружается при запуске приложения (но с устройством на базе «x86» загружается библиотека «x86»). и работает). Когда я исследую его (эмулятор) с помощью оболочки, я вижу, что:

lrwxrwxrwx install 2016-07-20 10:06 lib -> /data/app/com.**********/lib/x86

Установлена ​​только библиотека "x86"... Пояснения, пожалуйста?

(У меня такая же проблема при тестировании на Samsung Galaxy S3, процессор должен быть ARM Cortex-A9, и этот процессор реализует архитектуру ARMv7-A. Но моя библиотека тоже не найдена...)

&&&&&&&&&&&&&& ПОСЛЕ НЕКОТОРЫХ МАНИПОВ Я ИСПРАВИЛ ОШИБКУ В ANDROID.MK &&&&&&&&&&&&&&&&

Если вас интересует исключение, сгенерированное при вызове System.loadLibrary(), это следующее:

07-20 12:31:23.360: D/dalvikvm(3671): Trying to load lib /data/app-lib/com.**********/libNativeFFMPEG.so 0x40cdc118
07-20 12:31:23.370: W/System.err(3671): java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libswscale-3.so" needed by "libNativeFFMPEG.so"; caused by load_library(linker.cpp:745): library "libswscale-3.so" not found
07-20 12:31:23.370: W/System.err(3671):     at java.lang.Runtime.loadLibrary(Runtime.java:371)
...

Но когда я заглядываю в /data/app-lib/com.**********, я нахожу свои библиотеки "armeabi-v7a"!!

root@android:/data/app-lib/com.********** # ls
gdbserver
libNativeFFMPEG.so
libavcodec-56.so
libavutil-54.so
libswscale-3.so

Но это еще исключение! Когда я пытаюсь загрузить swscale, например System.loadLibrary("swscale-3");, я получаю следующее исключение:

07-20 12:56:36.351: E/dalvikvm(4174): dlopen("/data/app-lib/com.**********/libswscale-3.so") failed: Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libavutil-54.so" needed by "libswscale-3.so"; caused by load_library(linker.cpp:745): library "libavutil-54.so" not found
07-20 12:56:36.361: W/System.err(4174): java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libavutil-54.so" needed by "libswscale-3.so"; caused by load_library(linker.cpp:745): library "libavutil-54.so" not found
07-20 12:56:36.361: W/System.err(4174): java.lang.UnsatisfiedLinkError: Cannot load library: soinfo_link_image(linker.cpp:1635): could not load library "libavutil-54.so" needed by "libswscale-3.so"; caused by load_library(linker.cpp:745): library "libavutil-54.so" not found

И когда я пытаюсь загрузить avutil-54, у меня такое же исключение "NativeFFMPEG" (но с libavutil-54.so)


person N0un    schedule 20.07.2016    source источник
comment
Что внутри вашего окончательного файла apk? У вас есть каталоги x86 и armeabi-v7a с необходимыми библиотеками? Если нет - посмотрите фильтры ABI в java-модуле.   -  person user1056837    schedule 20.07.2016
comment
Да у меня есть оба в сгенерированном .apk, с библиотеками внутри @user1056837   -  person N0un    schedule 20.07.2016
comment
Я могу предложить использовать java-функцию System.loadLibrary() при запуске приложения и перехватывать ее исключение. В сообщении об исключении будет информация, где система пытается найти вашу библиотеку. Это может быть полезно.   -  person user1056837    schedule 20.07.2016
comment
Я полагал, что он должен был напечатать список директорий, в которых он не мог найти библиотеку. Тогда следующий вопрос. У вас в apk файле только две директории с родными либами (т.е. x86, armeabi-v7a)? И правильная ли ваша последовательность loadLibrary (я думаю, что да, но, возможно, на x86 есть какое-то странное поведение; я имею в виду, что swscale загружается до ffmpeg)?   -  person user1056837    schedule 20.07.2016
comment
Хорошо, я обновляю свой пост (опять же...). В моем эмуляторе есть правильные библиотеки armeabi-v7a, но loadLibrary по-прежнему не работает. Я просто называю это так (в окружении try/catch) System.loadLibrary(NativeFFMPEG);   -  person N0un    schedule 20.07.2016
comment
Попробуйте загрузить swscale и другие библиотеки вручную перед загрузкой NativeFFMPEG. Таким образом, у вас будет несколько loadLibraryвызовов для каждой из ваших общих библиотек.   -  person user1056837    schedule 20.07.2016
comment
Странное исключение: кажется, что он определяет, что swscale зависит от avutil, но когда я хочу загрузить avutil, он создает исключение, похожее на загрузку NativeFFMPEG (показать редактирование) @user1056837   -  person N0un    schedule 20.07.2016
comment
Давайте продолжим обсуждение в чате.   -  person user1056837    schedule 20.07.2016


Ответы (1)


Наконец решил мою проблему с помощью @user1056837.

Странная вещь, которую мне нужно искать, это то, что:

Для ABI "x86" (по крайней мере?), когда вы хотите использовать libmylib.so, который зависит от других библиотек, вам просто нужно загрузить libmylib.so:

System.loadLibrary("mylib");

Но для ABI "armeabi-v7a" (по крайней мере?) вам нужно вручную загрузить свою библиотеку, зависимости вашей библиотеки и зависимости зависимости вашей библиотеки...

System.loadLibrary("dep1");
System.loadLibrary("dep2");
System.loadLibrary("mylib");

Четкого объяснения у меня пока нет, но я его найду. Я надеюсь, что это может помочь кому-то.

РЕДАКТИРОВАТЬ: проблема не в целевой арке, а в компиляции моего собственного кода/библиотек.

person N0un    schedule 20.07.2016