Loading shared libs qui dépendent d'autres shared libs
Problème:
Je suis bâtiment de l'application pour Android dans Eclipse qui utilise partagé lib libgstreamer-0.10.so
(GStreamer-android NDK Bundle libs compilé pour android-8 plate-forme). J'ai fait un nouveau dossier libs/armeabi
dans le dossier racine du projet et de le mettre là. Aussi, j'ai mis tous les autres libs qui est venu avec elle (158) dans le même dossier. Si j'ai mis cela dans mon activité principale code:
static{
System.loadLibrary("gstreamer-0.10");
}
Et de construire/installer/exécuter mon application sur Android-8 émulateur, il met cette erreur:
06-15 21:54:00.835: E/AndroidRuntime(402): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1962]: 33 could not load needed library 'libglib-2.0.so' for 'libgstreamer-0.10.so' (load_library[1104]: Library 'libglib-2.0.so' not found)
Maintenant, libglib-2.0.so
est dans le même dossier que libgstreamer-0.10.so
, et pourquoi n'est-il pas chargé? Je reçois ce que l'éditeur de liens essaie de le charger à partir /system/lib
et libglib-2.0.so
n'est tout simplement pas là, mais pourquoi n'est-il pas le charger à partir de l'emplacement où libgstreamer-0.10.so
est?
Je suis donc allé à découvrir les libs libgstreamer-0.10.so
dépend avec cette commande:
arm-linux-androideabi-readelf -d libgstreamer-0.10.so
Résultats:
Dynamic section at offset 0x118b64 contains 29 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libglib-2.0.so]
0x00000001 (NEEDED) Shared library: [libgobject-2.0.so]
0x00000001 (NEEDED) Shared library: [libgthread-2.0.so]
0x00000001 (NEEDED) Shared library: [libgmodule-2.0.so]
0x00000001 (NEEDED) Shared library: [libdl.so]
0x00000001 (NEEDED) Shared library: [libm.so]
0x00000001 (NEEDED) Shared library: [libstdc++.so]
0x00000001 (NEEDED) Shared library: [libc.so]
0x0000000e (SONAME) Library soname: [libgstreamer-0.10.so]
0x00000010 (SYMBOLIC) 0x0
Quatre premiers libglib-2.0.so, libgobject-2.0.so, libgthread-2.0.so, libgmodule-2.0.so
sont tous situés dans le même dossier libgstreamer-0.10.so
est situé à (/data/data/com.marko.gstreamer_test/lib
) sur l'appareil.
Solution logique:
Donc, j'ai essayé de charger ces quatre libs avant que je charge libgstreamer-0.10.so
et, il a travaillé:
static{
System.loadLibrary("glib-2.0");
System.loadLibrary("gthread-2.0");
System.loadLibrary("gobject-2.0");
System.loadLibrary("gmodule-2.0");
System.loadLibrary("gstreamer-0.10");
}
Mes questions sont:
- Je peux en quelque sorte dire à l'éditeur de liens pour charger les libs également de l'application de l'endroit? Comme ajouter un chemin d'accès à certains variable d'environnement ou de quelque chose... similaire de CHEMIN sur Linux.
- Ma solution ont quelques mauvais effets secondaires? Je veux dire, linker serait le faire aussi avant qu'il charge la libgstreamer-0.10.donc. Mais cela fera pas de problèmes?
- Puis-je installer mon libs pour /system/lib dossier sur non racinées appareil?
Comment avez-vous déterminer qui bibliothèques de charger explicitement?
arm-linux-androideabi-readelf -d libgstreamer-0.10.so
donne la liste des dépendances. Certains d'entre eux sont déjà chargé (libc, etc), mais certains vous avez besoin de charger explicitement.OriginalL'auteur Cipi | 2012-06-15
Vous devez vous connecter pour publier un commentaire.
Selon https://groups.google.com/forum/?fromgroups#!msg/android-ndk/J3lzK4X--bM/4YaijymZy_AJ
J'ai envoyé un courriel de l'auteur demandant où cela est documenté.
Tor Lillqvist va fournir une solution de contournement: https://groups.google.com/d/msg/android-ndk/J3lzK4X--bM/n2zUancIFUEJ
Vous pouvez trouver son code à http://cgit.freedesktop.org/libreoffice/core/tree/sal/android/lo-bootstrap.c?id=5510127e89d6971a219ce3664e4631d6c6dda2b1
Mise à JOUR: Selon http://code.google.com/p/android/issues/detail?id=34416 ce code a été intégré dans Android en décembre 2012. Yay!!! Les dépendances sont automatiquement chargé pour les appareils avec l'API de niveau 18 et. Si vous prenez en charge les anciennes API niveaux que vous avez encore besoin de lister les dépendances.
OriginalL'auteur Gili
Je ne suis pas sûr que vous pouvez faire pour les applications Java. Pour les applications en ligne de commande, vous pouvez le faire en définissant la variable d'environnement LD_LIBRARY_PATH avant de déclarer d'application.
C'est la bonne solution. Quelque part dans NDK docs c'est mentionné que vous avez besoin de charger toutes les bibliothèques dépendantes de cette façon.
Non, vous ne pouvez pas le faire.
OriginalL'auteur Mārtiņš Možeiko