android ndk UnsatisfiedLinkError quando si utilizza una libreria condivisa preinstallata

Sto provando a creare una libreria condivisa che collega un'altra libreria condivisa.

Ecco il mio module principale Android.mk:

  • C'è un modo per mettere degli extra a intenti dalle preferenze?
  • Strano exception: non è ansible lanciare String in Boolean quando si utilizza getBoolean
  • Come portre l'attività esistente Android in avanti tramite notifica
  • Il progetto Cordova di Visual Studio 2015 RTM non eseguirà il debug / implementazione su Android, Windows e Windows Phone
  • Come salvare le coordinate GeoFire insieme ad altri elementi nel database Firebase?
  • Ridimensiona il disegno in Android
  • TOP_LOCAL_PATH := $(call my-dir) include $(call all-subdir-makefiles) LOCAL_PATH := $(TOP_LOCAL_PATH) include $(CLEAR_VARS) LOCAL_CPP_EXTENSION := cpp LOCAL_C_INCLUDES := $(LOCAL_PATH)/include/ $(LOCAL_PATH)/lib/include LOCAL_MODULE := SightCore-jni LOCAL_SRC_FILES := SightDemo.cpp SightCore-jni.cpp LOCAL_SHARED_LIBRARIES := SightAPI LOCAL_LDLIBS = -llog include $(BUILD_SHARED_LIBRARY) 

    Ho anche la libreria condivisa preinstallata nella directory ./lib con un proprio file Android.mk:

     LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := SightAPI LOCAL_SRC_FILES := libSightAPI.so LOCAL_C_INCLUDES := $(LOCAL_PATH)/include include $(PREBUILT_SHARED_LIBRARY) 

    Il file sorgente SightCore-jni.cpp è l'interface jni alla libreria condivisa e viene caricata mediante il command

     System.loadLibrary("SightCore-jni"); 

    Durante il process di costruzione di ndk non ottengo errori di compilazione o collegamento . Quando provo a eseguire l'applicazione e accedere a uno dei methods nativi, ottengo l'UnsatsfiedLinkError. Ho notato che se disabilitare i riferimenti al SightAPI nel mio codice jni e mettere un errore di inserimento nella linea LOCAL_STATIC_LIBRARIES: = SightAPI, la build è rioutput e non esiste UnsatisfiedLinkError .
    Questo significa che il codice jni che ho è buono (io sono in realtà sicuro che sia ok …)

    Quindi l'osservazione è la seguente:
    Se compila la libreria condivisa con la libreria condivisa preinstallata, ottengo un file corretto .so.

    Se compila lo stesso progetto ndk senza collegarsi alla libreria condivisa preinstallata , non esiste alcun problema a caricare la libreria condivisa dal lato java.

    Aiutaci ad aiutarmi se puoi.

    Grazie in anticipo,

    Ita

  • Lasciare l'image di ritaglio dell'utente
  • Come sapere se è stato triggersto o distriggersto "Dati di networking mobile" (anche quando è connesso tramite WiFi)?
  • Salvataggio dell'ingresso audio del motore di riconoscimento vocale Android
  • getContentLength () restituisce -1 solo in WiFi?
  • J2ME VS Android VS iPhone VS Symbian VS Windows CE
  • Il metodo checkSelfPermission (Context, String) non è definito per il tipo ContextCompat
  • 2 Solutions collect form web for “android ndk UnsatisfiedLinkError quando si utilizza una libreria condivisa preinstallata”

    Trovato il problema.

    A quanto pare il sistema ndk build non carica automaticamente le librerie condivise di riferimento , anche se sono state dichiarate nel vostro Android.mk.

    Ho dovuto call System.loadLibrary(SightAPI) & System.loadLibrary("SightCore-jni") per risolvere questo problema. Mi sarei aspettato che l'unica libreria da caricare sarebbe stata la biblioteca principale SightCore-jni .

    Beh … credo che la morale è se vuoi qualcosa finito, fai da te 🙂

    +1 a Roy Samuel per il suo sforzo e gli istinti corretti.

    Spero che questo aiuti chiunque.

    Saluti

    1. Si è assicurato che il nome della function cpp, che si desidera utilizzare per il JNI, corrisponde al nome del pacchetto della class di avvolgimento Java in cui System.loadLibrary("SightCore-jni"); è presente?

      ad esempio se si desidera utilizzare la function C, myFunction nello strato java e supponiamo che la class com.my.package.sightcore JNI sia nel pacchetto com.my.package.sightcore , allora il nome del codice del codice C dovrebbe essere così:

       JNIEXPORT JNICALL Java_com_my_package_sightcore_myFunction(JNIEnv * env, jobject thiz, ...) 
    2. Se stai eseguendo l'applicazione sul dispositivo, controlla se i livelli dell'API e quindi il rilascio di sdk corrispondono alla versione Android (livello API) del tuo dispositivo.

    Spero che questo ti aiuti. Fammi sapere se hai bisogno di ulteriori chiarimenti …

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