¿Cómo integrar la biblioteca en tiempo de ejecución nativa con dlopen en NDK?

Para mi proyecto nativo de C ++ tengo que configurar una carga de tiempo de ejecución de una biblioteca compartida precompilada, que podría ser cambiado por el lado del cliente en el arranque utilizando configuraciones. ¿Cuál es la forma correcta de llamar a dlopen en android? No importa lo que haga, dlopen nunca puede abrir ninguna biblioteca compartida, si no defino esta biblioteca como biblioteca precompilada en mi archivo Android.mk así:

LOCAL_PATH := $(call my-dir) LOCAL_CFLAGS += -DDEBUG LOCAL_CFLAGS += -DANDROID include $(CLEAR_VARS) LOCAL_MODULE := bar LOCAL_SRC_FILES := bar/bar.cpp LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/bar include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := native_activity LOCAL_SRC_FILES := main.cpp LOCAL_LDLIBS := -llog LOCAL_LDLIBS += -landroid LOCAL_SHARED_LIBRARIES := bar LOCAL_STATIC_LIBRARIES += android_native_app_glue include $(BUILD_SHARED_LIBRARY) $(call import-module, android/native_app_glue) 

En mi clase principal de actividad nativa, intento cargar la biblioteca con:

 void* lib = dlopen("/system/lib/armeabi-v7a/libbar.so", RTLD_NOW); if (lib == NULL) { fprintf(stderr, "Could not dlopen(\"libbar.so\"): %s\n", dlerror()); exit(1); }else{ LOGI("Library successfully loaded!"); if (dlsym(lib, "bar") == NULL) { fprintf(stderr, "Symbol 'bar' is missing from shared library!!\n"); }else{ LOGI("Library symbol found!"); } int x = bar(25); LOGI("Bar return value: %i", x); } 

El desacuerdo de esta implementación es que no es realmente una carga de tiempo de ejecución, porque tengo que cargar esta biblioteca también en JNI inicio utilizando mecanismos de JAVA.

Si elimino las definiciones de precompilación de la barra de barras de Android.mk, deshabilitar la carga de JNI en el inicio y agregar una copia de la biblioteca precompilada a la carpeta systems / lib donde debe estar (el mismo lugar donde se almacena usando definiciones de precompilación) De la biblioteca falla. He comprobado el paquete apk que contiene mi biblioteca copiada manualmente en la carpeta lib como se esperaba.

¿Por qué esto no funciona? ¿Es posible realizar una carga de biblioteca de tiempo de ejecución nativa estricta de una biblioteca externa precompilada? ¿Y cuál es la mejor manera de asegurar que mi biblioteca se agregue al paquete apk?

La mejor estrategia en Android es cargar todas las bibliotecas nativas de Java, incluso si elige qué bibliotecas cargar, por algunas reglas de tiempo de ejecución. Puede utilizar dlsym (0, …) para acceder a las funciones exportadas allí.

El constructor de APK recogerá todos los archivos .so que encuentre en libs/armeabi-v7a y el instalador los desempaquetará en el directorio /data/data/<your.package>/lib .

  • Android: Dialog de diálogo de actividad desaparece inesperadamente
  • Error en la integración de la biblioteca mupdf
  • Obtener el nombre de la aplicación de NDK
  • FindClass no puede encontrar la clase Java personalizada
  • AndroidRuntime Causado por: java.lang.unsatisfiedLinkError: No se pudo cargar tfp_jni: findLibrary returned null
  • google :: protobuf usado en android ndk desarrollar
  • NDK64 y NDK32 r10
  • Distribuir la biblioteca NDK con gnustl?
  • Android ndk: Problema para la llamada del método Java desde c ++ con jni
  • Android: Cómo hacer que los archivos de los elementos del juego sean legibles desde el código c ++ usando ndk
  • ¿Cómo instalo Android NDK en el sistema operativo Windows? Sin ningún tipo de Linux Unix de la manera más fácil?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.