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

Para mi proyecto c ++ nativo, tengo que configurar una carga en tiempo de ejecución de una biblioteca compartida precompilada, que podría ser cambiada por el lado del cliente al iniciar 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 una biblioteca precompilada en mi archivo Android.mk como este:

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);
}

La desventaja 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 el inicio de JNI utilizando mecanismos JAVA.

Si elimino las definiciones de precompilación de la biblioteca de barras de Android.mk, deshabilito la carga de JNI en el inicio y agrego una copia de la biblioteca precompilada a la carpeta de sistemas / lib donde debería estar (el mismo lugar donde se almacena con las definiciones de precompilación), la carga 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 funcionará? ¿Es posible realizar una carga estricta de la biblioteca de tiempo de ejecución nativa de una biblioteca externa precompilada? ¿Y cuál es la mejor manera de asegurar que mi biblioteca se agregue al paquete apk?

Respuestas a la pregunta(1)

Su respuesta a la pregunta