Problema:Cargando compartido bibliotecas que dependen de otras bibliotecas compartidas
Estoy construyendo aplicación Android en Eclipse que utiliza compartida lib libgstreamer-0.10.so
(GStreamer-Android NDK libs Bundle compilados para la plataforma android-8). Hice la nueva carpeta libs/armeabi
en la carpeta raíz del proyecto y la puse allí. Además, he puesto todas las otras librerías que venían con él (158 de ellas) en la misma carpeta. Si pongo esto en mi principal código de actividad:
static{
System.loadLibrary("gstreamer-0.10");
}
y construir/instalar/ejecutar mi aplicación en Android-8 emulador, se lanza este error:
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)
Ahora, libglib-2.0.so
es de la misma carpeta como libgstreamer-0.10.so
, y ¿por qué no está cargado? Me sale que el enlazador intenta cargarlo desde /system/lib
y libglib-2.0.so
simplemente no está allí, pero ¿por qué no lo está cargando desde la ubicación donde está libgstreamer-0.10.so
?
así que fui a descubrir qué libs libgstreamer-0.10.so
depende de con este comando:
arm-linux-androideabi-readelf -d libgstreamer-0.10.so
Resultados:
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
Primera de cuatro libglib-2.0.so, libgobject-2.0.so, libgthread-2.0.so, libgmodule-2.0.so
están ubicados en la misma carpeta libgstreamer-0.10.so
se encuentra en (/data/data/com.marko.gstreamer_test/lib
) en el dispositivo.
solución lógica:
tanto, he intentado cargar estos cuatro librerías antes me carga libgstreamer-0.10.so
y, funcionó:
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");
}
Mis preguntas son:
¿Puedo decirle al vinculador que cargue libs también desde la ubicación de la aplicación? Como agregar ruta a alguna variable de entorno o algo ... similar a PATH en Linux.
¿Mi solución tiene algunos efectos secundarios negativos? Quiero decir, el enlazador también haría esto antes de cargar el libgstreamer-0.10.so. Pero, ¿esto creará algún problema?
¿Puedo instalar mis libs en la carpeta /system/lib en un dispositivo sin estela?
Ese truco es en realidad la solución que recomiendan los propios desarrolladores de Android: https://groups.google.com/forum/?fromgroups#!topic/android-ndk/F7DnfSQt8qs Con decisiones técnicas como esa, no es de extrañar que Android sea tan calesa. –
¿Cómo determinaste qué bibliotecas cargar explícitamente? –
@dpk 'arm-linux-androideabi-readelf -d libgstreamer-0.10.so' proporciona la lista de dependencias. Algunos de ellos ya están cargados (libc, etc.), pero algunos deben cargarse explícitamente. – chrisvarnz