Come integrare la libreria di runtime nativa con dlopen su NDK?

Per il mio progetto c ++ nativo devo impostare un caricamento runtime di una libreria condivisa precompilata, che potrebbe essere modificata da parte del client all'avvio utilizzando configurazioni. Qual è il modo giusto di call dlopen su android? Non import cosa faccio, dlopen non può mai aprire una libreria condivisa, se non definisco questa libreria come libreria precompilata nel mio file Android.mk come questo:

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) 

Nella class principale di attività nativa cerco di caricare la libreria con:

  • Come modificare il pixel rgb di una bitmap per sembrare diverso
  • Come get i dati di un'altra attività in android?
  • Android SearchView nella barra degli strumenti
  • Android 3.0 - quali sono i vantaggi di utilizzare installazioni LoaderManager esattamente?
  • Come rilevare il dublino su una vista?
  • Android: NullPointerException Imansible caricare il database in listview all'interno di un frammento
  •  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); } 

    Il disadvantaggio di questa implementazione è che non è realmente un caricamento del runtime, perché devo caricare questa libreria anche in avvio JNI utilizzando i meccanismi JAVA.

    Se rimuovo le definizioni di precompilazione della barra da Android.mk, distriggersre il caricamento JNI all'avvio e aggiungere una copia della libreria precompilata alla cartella systems / lib where dovrebbe essere (lo stesso luogo in cui viene memorizzato utilizzando definizioni precompilabili), il caricamento della libreria non riesce. Ho controllato il pacchetto apk che contiene la mia libreria copiata manualmente nella cartella lib come previsto.

    Perché questo non funziona? È ansible eseguire un rigido carico di libreria di runtime nativo di una libreria precompilata esterna? E qual è il modo migliore per assicurare che la mia libreria sia aggiunta al pacchetto apk?

  • Come trovare la posizione utente utilizzando la torre di cella?
  • cosa può causare un socket () errore "Permesso negato"?
  • Come posso memorizzare e recuperare le preferenze in Android?
  • Cordova: È ansible avere differenti ID app per le piattaforms Android e iOS?
  • Errore di installazione: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED
  • Ogni telefono Android support SHA-256
  • One Solution collect form web for “Come integrare la libreria di runtime nativa con dlopen su NDK?”

    La strategia migliore su Android è quella di caricare tutte le librerie natali da Java, anche se si sceglie quali librerie da caricare, da alcune regole di runtime. È ansible utilizzare dlsym (0, …) per accedere alle funzioni esportte.

    Il constructor di APK raccoglierà tutti i file .so che si trova in libs/armeabi-v7a e il programma di installazione li /data/data/<your.package>/lib nella directory /data/data/<your.package>/lib .

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.