Android – ¿Cómo cargar la biblioteca compartida?

He creado más simple EXECUTABLE 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 abajo:

Primero h

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

Primero 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 – all hello

 ... 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 no es diferente RPATH tampoco)

¿Qué hago mal?

¿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 utiliza y no es necesario para el proyecto.

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

El enlazador-cargador Bionic (android / bionic / linker / linker.c en la fuente AOSP, si quieres chequear) parece ignorar completamente a RPATH en el ELF. Sólo considera LD_LIBRARY_PATH y una matriz de "/ vendor / lib" y "/ system / lib".

Esto se basa en una exploración rápida del código en el Ice Cream Sandwich árbol que he comprobado.

Esto explicaría el comportamiento que está viendo.

  • Construir biblioteca compartida enlazando a otras bibliotecas no estándar compartidas
  • Android ndk UnsatisfiedLinkError al usar una biblioteca compartida precompuesta
  • Compartir una biblioteca de Android entre varias aplicaciones de Android con Gradle
  • Android, la mejor manera de proporcionar constantes específicas de la aplicación en un proyecto de biblioteca?
  • ¿Cómo construir OpenSSL como biblioteca compartida no versionada para Android?
  • Agregar una lib nativa a un APK
  • Comprensión del diálogo del selector de color
  • Errores de coincidencia de tar cuando agrega biblioteca en eclipse
  • Integración de una biblioteca Java externa externa y acceso a clases de Android en ella
  • Cómo usar una biblioteca compartida en la actividad nativa
  • Vinculación con la biblioteca compartida versionada en Android NDK
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.