Как интегрировать нативную библиотеку времени выполнения с dlopen на NDK?

Для моего собственного проекта на c ++ я должен настроить загрузку предварительно скомпилированной разделяемой библиотеки, которая может быть изменена на стороне клиента при запуске с использованием конфигураций. Как правильно называть dlopen на Android? Независимо от того, что я делаю, dlopen никогда не сможет открыть какую-либо общую библиотеку, если я не определю эту библиотеку как предварительно скомпилированную библиотеку в моем файле Android.mk, например так:

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)

В своем основном классе основной деятельности я пытаюсь загрузить библиотеку:

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

Недостатком этой реализации является то, что на самом деле это не загрузка во время выполнения, потому что я загружаю эту библиотеку также при запуске JNI, используя механизмы JAVA.

Если я удаляю определения прекомпиляции библиотеки bar из Android.mk, отключаю загрузку JNI при запуске и добавляю копию предварительно скомпилированной библиотеки в папку systems / lib, где она должна быть (там же, где она хранится с использованием определений прекомпиляции), загрузка библиотеки не удается. Я проверил пакет apk, который содержит мою скопированную вручную библиотеку в папке lib, как и ожидалось.

Почему это не сработает? Можно ли выполнить строгую загрузку встроенной библиотеки внешней предварительно скомпилированной библиотеки? И как лучше всего добавить мою библиотеку в пакет apk?

Ответы на вопрос(1)

Ваш ответ на вопрос