Nessun JNI_OnLoad trovato saltando init> Arresto dell’applicazione

gente,

Sto lavorando su un’applicazione Android in cui ho bisogno di una libreria .so di terze parti. Ho creato questa libreria di terze parti (con ndk-build) secondo le loro istruzioni e stavo cercando di includere questo .so nel mio progetto Android.

Pertanto ho seguito i passaggi descritti in docs / PREBUILTS.html e creato con successo il nuovo .so nella directory jni / prebuilt. Ora ho provato a sfruttare le strutture .so usandolo in una semplice app per Android test. Quindi quello che faccio è:

static { Log.i("load so > ","load so"); System.loadLibrary("xyz"); } /* The native functions */ private static native int openFile(String filename); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try{ String path = getPathForDownloadDirectoryFile(); Log.i("file path> ", path); int num= openFile(path); }catch(Exception e){ Log.e(">", "could not open the file"); } } 

Ora quando eseguo la mia app ricevo un messaggio di debug che dice: No JNI_OnLoad trovato in /data/data/com.example.myfirstapp/lib/xyz.so 0x411e6738, saltando init e quindi l’applicazione si arresta.

Per ulteriori informazioni, ecco il log degli errori:

 No JNI_OnLoad found in /data/data/com.example.mysecondapp/lib/xyz.so 0x411e67a0, skipping init W/dalvikvm( 570): No implementation found for native Lcom/example/mysecondapp/MainActivity;.openFile:(Ljava/lang/String;)I D/AndroidRuntime( 570): Shutting down VM W/dalvikvm( 570): threadid=1: thread exiting with uncaught exception (group=0x40a13300) E/AndroidRuntime( 570): FATAL EXCEPTION: main E/AndroidRuntime( 570): java.lang.UnsatisfiedLinkError: Native method not found: com.example.mysecondapp.MainActivity.openFile:(Ljava/lang/String;)I E/AndroidRuntime( 570): at com.example.mysecondapp.MainActivity.openFile(Native Method) E/AndroidRuntime( 570): at com.example.mysecondapp.MainActivity.onCreate(MainActivity.java:31) E/AndroidRuntime( 570): at android.app.Activity.performCreate(Activity.java:5008) E/AndroidRuntime( 570): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) E/AndroidRuntime( 570): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) E/AndroidRuntime( 570): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) E/AndroidRuntime( 570): at android.app.ActivityThread.access$600(ActivityThread.java:130) E/AndroidRuntime( 570): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) E/AndroidRuntime( 570): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime( 570): at android.os.Looper.loop(Looper.java:137) E/AndroidRuntime( 570): at android.app.ActivityThread.main(ActivityThread.java:4745) E/AndroidRuntime( 570): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime( 570): at java.lang.reflect.Method.invoke(Method.java:511) E/AndroidRuntime( 570): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) E/AndroidRuntime( 570): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) E/AndroidRuntime( 570): at dalvik.system.NativeStart.main(Native Method) W/ActivityManager( 146): Force finishing activity com.example.mysecondapp/.MainActivity 

Come ho potuto vedere, l’implementazione nativa per il metodo openFile () non è stata trovata, ma la stessa xyz.so lib ha funzionato piuttosto bene con l’app di esempio originale della terza parte. Sono praticamente un antipasto con il mondo Android-ndk.

Java-Android-NDK Ninjas … qualsiasi ipotesi su cosa potrei mancare? Apprezzerò molto qualsiasi aiuto qui 🙂

Come ha detto Guycole “No JNI_OnLoad” è solo un avvertimento, il tuo problema sta altrove.

Come hai detto hai compilato con successo il tuo file “così”, il problema potrebbe risiedere nelle firme delle funzioni all’interno del tuo codice c / C ++ dovrebbe essere qualcosa del genere

 JNIEXPORT jint JNICALL Java_com_your_package_class_method(JNIEnv *d, jobject e, jstring f) { //some action } 

Le firme delle funzioni provengono dal file di intestazione che viene generato utilizzando lo strumento javah. È necessario generare il file di intestazione e utilizzare la firma della funzione con il nome del pacchetto. Per diversi nomi di pacchetti e classi, il file di intestazione e la corrispondente firma della funzione cambieranno.

 worked pretty neat with the original sample app from the third party 

Questo potrebbe essere il motivo per cui è in esecuzione sull’app di esempio e non sulla tua app.

fare riferimento a: https://thenewcircle.com/s/post/49/using_ndk_to_call_c_code_from_android_apps

Il messaggio “No JNI_OnLoad” è solo un avvertimento. JNI_OnLoad è un hook di inizializzazione opzionale.

Immagino che il tuo problema sia all’interno del metodo openFile (). Prova a commentare la chiamata da Java e guarda fino a che punto ottieni.

Ho un post sul blog su JNI e alcuni esempi di codice su http://guycole.blogspot.com/2012/03/yet-another-android-ndk-blog-posting.html – forse lo troverai utile.

In bocca al lupo.

Viene fornito anche con questo registro

?? – ?? ??: ??: ??. ???: INFO / (): java.lang.UnsatisfiedLinkError: Imansible caricare * : findLibrary restituito null

destra??

Penso che sia il problema dei file android.mk. 1: prova a swith per armabi v7. 2: load funciton chiamerà open (). controllare il permesso di così.

Come menzionato nelle risposte precedenti, No JNI_OnLoad è solo un avvertimento.

Avevo un problema simile, ho capito che il problema è dovuto alle operazioni sui file.

La mia app non aveva il permesso di scrittura esterno. Dopo aver aggiunto il codice seguente in manifest, funzionava correttamente