Как интегрировать нативную библиотеку времени выполнения с 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?