¿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:
- No se puede escribir en el registro ARM R4: feature o bug?
- Cómo agregar la biblioteca preconstruida * .so en android studio 2.2
- Distinción múltiple de versionkode de apk
- cómo utilizar ddms para fugas de memoria en código c ++
- Cómo usar mkfifo usando NDK de Android
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?
- Cómo crear un hilo en Android NDK?
- Uso de cURL en Android
- Cómo evitar la generación automática de Android.mk con el nuevo gradle experimental Plugin
- ¿Qué es Native Android con java?
- ABORTO: HEAP MEMORY CORRUPTION en NDK env. (Biblioteca POCO, Sqlite3, Cocos2dx)
- Hacer androide Bleutooth siempre visible
- ¿Diferencia entre bibliotecas estáticas y compartidas en el NDK de Android?
- Habilitar externalNativeBuild con división ABI
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
.
- Notificación de desgaste de Android en la parte superior
- Android: Excepción utilizando la interfaz de cierre con Socket