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:

  1. 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.
  2. 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?
  3. Puis-je installer mon libs pour /system/lib dossier sur non racinées appareil?
Ce hack est effectivement la solution que les développeurs Android recommandent: groups.google.com/forum/?fromgroups#!topic/android-ndk/... Avec les décisions techniques, comme ça, pas étonnant que Android est tellement buggé.
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