Jak zintegrować rodzimą bibliotekę wykonawczą z dlopen na NDK?

W przypadku mojego natywnego projektu c ++ skonfigurowałem ładowanie w czasie wykonywania prekompilowanej biblioteki współdzielonej, która może zostać zmieniona po stronie klienta podczas uruchamiania przy użyciu konfiguracji. Jaki jest właściwy sposób wywoływania dlopen na Androida? Bez względu na to, co robię, dlopen nigdy nie może otworzyć żadnej biblioteki współdzielonej, jeśli nie zdefiniuję tej biblioteki jako prekompilowanej biblioteki w moim pliku Android.mk w następujący sposób:

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)

W mojej rodzimej klasie głównej próbuję załadować bibliotekę za pomocą:

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

Wadą tej implementacji jest to, że tak naprawdę nie jest ładowaniem w czasie wykonywania, ponieważ mam załadować tę bibliotekę również na starcie JNI przy użyciu mechanizmów JAVA.

Jeśli usunę definicje prekompilacji biblioteki słupkowej z Android.mk, wyłącz ładowanie JNI podczas uruchamiania i dodaj kopię prekompilowanej biblioteki do folderu system / lib, w którym powinna się znajdować (to samo miejsce, w którym jest przechowywana za pomocą definicji prekompilacji), ładowanie biblioteki zawodzi. Sprawdziłem pakiet apk, który zawiera moją ręcznie skopiowaną bibliotekę w folderze lib zgodnie z oczekiwaniami.

Dlaczego to nie zadziała? Czy możliwe jest przeprowadzenie ścisłego ładowania biblioteki zewnętrznej środowiska prekompilowanej biblioteki? A jaki jest najlepszy sposób na zapewnienie, że moja biblioteka zostanie dodana do pakietu apk?

questionAnswers(1)

yourAnswerToTheQuestion