Cargando libs compartidas que dependen de otras libs compartidas
Problema:
Estoy construyendo una aplicación de Android en Eclipse que usa lib compartidalibgstreamer-0.10.so
(Libras del paquete NDK de GStreamer-android compiladas para la plataforma android-8). Hice nueva carpetalibs/armeabi
En la carpeta raíz del proyecto y ponerlo allí. Además, he puesto todas las demás librerías que vienen con ella (158 de ellas) en la misma carpeta. Si pongo esto en mi código de actividad principal:
static{
System.loadLibrary("gstreamer-0.10");
}
Y compilar / instalar / ejecutar mi aplicación en el emulador de Android-8, arroja 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
está en la misma carpeta quelibgstreamer-0.10.so
¿Y por qué no está cargado? Obtengo que el enlazador intenta cargarlo desde/system/lib
ylibglib-2.0.so
simplemente no está allí, pero ¿por qué no lo está cargando desde la ubicación dondelibgstreamer-0.10.so
¿es?
Así que fui a descubrir qué libslibgstreamer-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
Primeros cuatrolibglib-2.0.so, libgobject-2.0.so, libgthread-2.0.so, libgmodule-2.0.so
están todos ubicados en la misma carpetalibgstreamer-0.10.so
Se encuentra en (/data/data/com.marko.gstreamer_test/lib
) en el dispositivo.
Solución lógica:
Por lo tanto, traté de cargar estas cuatro bibliotecas antes de cargarlibgstreamer-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 también libs 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 haría esto también antes de cargar ellibgstreamer-0.10.so. ¿Pero esto hará algún problema?
¿Puedo instalar mis libretas a/ system / lib ¿Carpeta en dispositivo sin rootear?