2016-07-20 2 views
0

Pour présenter mon problème, j'ai une application utilisant NDK compilé uniquement pour les ABI "armeabi-v7a" et "x86". Donc la compilation me donne:Pourquoi la bibliothèque "x86" est-elle installée sur un émulateur "armeabi-v7a" au lieu de la bibliothèque "armeabi-v7a"?

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 

Mon problème est peut-être indiqué par cet avertissement? (Ce n'est pas la même version de la bibliothèque ffmpeg sur les deux ABIs cibles mais je ne pense pas que ce soit le problème)

Ensuite, je crée un émulateur avec CPU/ABI = (ARM) armeabi-V7A et mon lib n'est pas chargée lorsque l'application a démarré (mais avec un périphérique basé sur "x86", la librairie "x86" est chargée et fonctionne). Quand je l'explore (l'émulateur) avec une coquille, je peux voir que:

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

uniquement lib « x86 » est installé ... Explications s'il vous plaît?

(j'ai le même problème sur un test Samsung Galaxy S3, la CPU doit être A9 Cortex-ARM et que cette CPU implémente ARMv7-A l'architecture. Mais ma bibliothèque trouve pas non plus ...)

& & & & & & & & & & & & & & APRÈS QUELQUES MANIP I FIX eRREUR DANS ANDROID.MK & & & & & & & & & & & & & &

Si vous êtes intéressé par exception générée quand je l'appelle System.loadLibrary(), ce suit:

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) 
... 

Mais quand Je regarde dans /data/app-lib/com.**********, je trouve mon "armeabi-v7a" libs !!

[email protected]:/data/app-lib/com.********** # ls 
gdbserver 
libNativeFFMPEG.so 
libavcodec-56.so 
libavutil-54.so 
libswscale-3.so 

Mais c'est toujours l'exception! Lorsque j'essaie de charger swscale comme System.loadLibrary ("swscale-3"); J'ai une exception près:

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 

Et quand je tente la même chose pour charger avutil-54, j'ai la même exception de "NativeFFMPEG" (mais avec libavutil-54.so)

+0

Qu'est-ce qu'il y a dans votre fichier apk final? Avez-vous les deux répertoires ** x86 ** et ** armeabi-v7a ** avec les bibliothèques nécessaires? Si non - regardez les filtres ABI dans le module Java. – user1056837

+0

Oui, j'ai les deux dans le .apk généré, avec les bibliothèques à l'intérieur @ user1056837 – N0un

+0

Je peux suggérer d'utiliser la fonction java 'System.loadLibrary()' au démarrage de l'application et d'attraper son exception. Dans le message d'exception il y aurait des informations, où le système essaie de trouver votre bibliothèque. Cela pourrait être utile. – user1056837

Répondre

1

Enfin résolu mon problème avec l'aide de @ user1056837.

Chose étrange, je dois rechercher au sujet est que:

Pour ABI « x86 » (? Au moins), lorsque vous voulez utiliser un libmylib.so qui dépend d'autres bibliothèques, il vous suffit de charger libmylib .si:

System.loadLibrary("mylib"); 

Mais pour ABI "armeabi-V7A" (au moins?), vous devez charger manuellement votre lib, les dépendances de votre lib, et les dépendances de dépendance de votre lib ...

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

Je n'ai pas l'explication claire pour l'instant, mais je vais le trouver. J'espère que ça peut aider quelqu'un.

EDIT: Le problème ne concerne pas l'arc cible, mais la compilation de mon code natif/bibliothèques.