studio programacion herramientas fundamentos con avanzado aplicaciones android android-ndk shared-libraries

programacion - manual de android en pdf



Android: ¿cómo cargar la biblioteca compartida? (1)

El cargador-enlazador Bionic (android / bionic / linker / linker.c en la fuente AOSP, si desea verificarlo) parece ignorar por completo a RPATH en el ELF. Solo considera LD_LIBRARY_PATH y una matriz codificada de "/ vendor / lib" y "/ system / lib".

Esto se basa en un escaneo superficial del código en el árbol de Ice Cream Sandwich que he revisado.

Esto explicaría el comportamiento que estás viendo.

He creado los más simples EJECUTABLE y SHARED_LIBRARY. SHARED_LIBRARY no se carga sin cambiar LD_LIBRARY_PATH:

# ./hello ./hello link_image[1995]: failed to link ./hello CANNOT LINK EXECUTABLE # LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./hello Hello, world!

Todo el código a continuación:

first.h

#ifndef FIRST_H #define FIRST_H extern int first(int x, int y); #endif /* FIRST_H */

first.c

#include "first.h" int first( int x, int y ) { return x + y; }

Hola C

#include <stdio.h> #include "first.h" int main( int argc, char **argv ) { printf( "Hello, world!/n" ); first( 1000, 24 ); return 0; }

Android.mk

include $(CLEAR_VARS) LOCAL_MODULE := first LOCAL_SRC_FILES := first.c include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := hello LOCAL_SRC_FILES := hello.c LOCAL_SHARED_LIBRARIES := first LOCAL_LDFLAGS := -Wl,-rpath,. -Wl,-rpath,/data/data/testlib/lib include $(BUILD_EXECUTABLE)

readelf --todos hola

... Dynamic section at offset 0xef4 contains 25 entries: Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align INTERP 0x000154 0x00008154 0x00008154 0x00013 0x00013 R 0x1 [Requesting program interpreter: /system/bin/linker] ... Tag Type Name/Value 0x00000001 (NEEDED) Shared library: [libfirst.so] 0x00000001 (NEEDED) Shared library: [libstdc++.so] 0x00000001 (NEEDED) Shared library: [libm.so] 0x00000001 (NEEDED) Shared library: [libc.so] 0x00000001 (NEEDED) Shared library: [libdl.so] 0x0000000f (RPATH) Library rpath: [.:/data/data/testlib/lib]

RPATH está aquí, pero el enlazador no lo usa por alguna razón.

Aparentemente, el enlazador dinámico funciona bien en Android (con LD_LIBRARY_PATH y tampoco es RPATH diferente)

¿Qué hago mal?

¿Me estoy perdiendo algo obvio?

RPATH tiene dos directorios en mi ejemplo, (.: / Data / data / testlib / lib), uno (.) Debería ser suficiente.

No hay Java en este ejemplo. No se usa ni se necesita para el proyecto.

Básicamente estoy buscando una forma estándar para cargar bibliotecas compartidas desde "mi directorio" sin cambiar LD_LIBRARY_PATH (no es posible a veces) o usando wrapper para dlopen todas las librerías requeridas.