Problem auf andere gemeinsam genutzte Bibliotheken abhängen:Laden geteilt Libs, die
Ich baue Android App in Eclipse, die lib libgstreamer-0.10.so
(GStreamer-Android NDK Bundle Libs für Android-8-Plattform kompiliert) verwendet den gemeinsamen. Ich habe den neuen Ordner libs/armeabi
im Projektstammordner abgelegt und dort abgelegt. Außerdem habe ich alle anderen Bibliotheken (158 davon) in den gleichen Ordner gelegt. Wenn ich dies in meiner Haupttätigkeit Code setzen:
static{
System.loadLibrary("gstreamer-0.10");
}
Und bauen/install/betreiben meinen App auf Android-8 Emulator, wirft es diesen Fehler:
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)
Nun libglib-2.0.so
ist in den gleichen Ordner als libgstreamer-0.10.so
, und warum ist es nicht geladen? Ich bekomme, dass Linker versucht, es von /system/lib
laden und libglib-2.0.so
ist einfach nicht da, aber warum lädt es nicht von der Stelle, wo libgstreamer-0.10.so
ist?
Also ging ich zu entdecken, welche Libs libgstreamer-0.10.so
mit diesem Befehl abhängt:
arm-linux-androideabi-readelf -d libgstreamer-0.10.so
Ergebnisse:
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
Die ersten vier libglib-2.0.so, libgobject-2.0.so, libgthread-2.0.so, libgmodule-2.0.so
sind alle im selben Ordner befinden libgstreamer-0.10.so
in befindet (/data/data/com.marko.gstreamer_test/lib
) auf dem Gerät.
logische Lösung:
Also habe ich versucht, diese vier Libs zu laden, bevor ich libgstreamer-0.10.so
laden und es funktionierte:
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");
}
Meine Fragen sind:
Kann ich dem Linker irgendwie sagen, dass er libs auch vom App-Standort laden soll? Wie den Pfad zu einer Umgebungsvariablen oder etwas hinzufügen ... ähnlich wie PATH unter Linux.
Hat meine Lösung einige schlechte Nebenwirkungen? Ich meine, Linker würde dies auch tun, bevor es die libgstreamer-0.10.so lädt. Aber wird das irgendwelche Probleme machen?
Kann ich meine libs auf /system/lib Ordner auf unrooted Gerät installieren?
Dieser Hack ist eigentlich die Lösung, die die Android-Entwickler selbst empfehlen: https://groups.google.com/forum/?fromgroups#!topic/android-ndk/F7DnfSQt8qs Mit technischen Entscheidungen wie diese, kein Wunder, ist Android so Buggy. –
Wie haben Sie festgestellt, welche Bibliotheken explizit geladen werden sollen? –
@dpk 'arm-linux-androideabi-readelf -d libgstreamer-0.10.so' gibt die Liste der Abhängigkeiten an. Einige von ihnen sind bereits geladen (libc, etc), aber einige müssen Sie explizit laden. – chrisvarnz