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:

  • Ascolta un brusco con Android
  • Come spinare un'icona android sul suo punto centrale?
  • Android: L'elemento errato è controllato quando si elenca la list
  • Conversione da Editable a int in android
  • Se le applicazioni chiamano gcm.register () each sette giorni per garantire i ID di logging validi?
  • Come sapere quando la sincronizzazione è terminata?
  •  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?

  • BroadcastReceiver non funziona se chiudo le applicazioni recenti
  • Esegue comandi adb su tutti i dispositivi collegati
  • Problema di rendering offscreen / bitmap di WebView WebView
  • Come facciamo ad abilitare SNI in HttpClient 4.4+ su Android?
  • Vista di Android EditText Suggerimento galleggiante nel disegno di materiale
  • L'icona della scheda TabLayout selezionata non è selezionata all'avvio:
  • 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.