2012-09-27 11 views
14

Folks,Nessun JNI_OnLoad trovato saltare init> shutdown Applicazione

sto lavorando su un'applicazione Android in cui ho bisogno di una terza parte .so biblioteca. Ho creato questa libreria di terze parti (con ndk-build) come da istruzioni e cercavo quindi per includere questo .so nel mio progetto Android.

Pertanto ho seguito i passaggi descritti in docs/PREBUILTS.html e creato con successo il nuovo 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 applicazione ricevo un messaggio di debug dicendo: Nessun JNI_OnLoad trovato in /data/data/com.example.myfirstapp/lib/xyz.so 0x411e6738, saltando init e quindi l'applicazione si arresta.

Per maggiori 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 constatare che l'attuazione nativo per l'openFile() metodo non è stato trovato, ma lo stesso xyz.so lib lavorato abbastanza pulito con l'originale esempio di app di terze parti. Sono praticamente un antipasto con il mondo Android-ndk.

Java-Android-NDK Ninjas ... qualsiasi ipotesi su cosa potrei mancare? Apprezzerò molto qualsiasi aiuto qui :)

risposta

16

Come ha detto Guy "No JNI_OnLoad" è solo un avvertimento, il tuo problema si trova altrove.

Come lei ha ricordato di aver compilato correttamente il file "così", il problema potrebbe risiedere nelle vostre firme di funzione all'interno del codice C/C++ dovrebbe essere qualcosa di simile

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

} 

Le firme funzione proviene da il 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.

riferiscono: https://thenewcircle.com/s/post/49/using_ndk_to_call_c_code_from_android_apps

+0

giusto! il nome del pacchetto potrebbe essere la ragione! Fammi provare con una confezione adeguata. Tornerò da te allora, grazie! –

+0

Costruisco .so con una nuova struttura del pacchetto che è il mio ma ora sto ricevendo errore [INSTALL_FAILED_MISSING_SHARED_LIBRARY] durante l'installazione dell'apk sul dispositivo nonostante il fatto che xyz.so sia presente in Project_folder/libs/arm_folder. Qualche idea di cosa potrebbe esserci dietro? –

+0

incolla il tuo make file e prova anche a eseguire l'esempio dato nel link, otterrai una certa chiarezza. –

6

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

Immagino che il 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 codici di esempio su http://guycole.blogspot.com/2012/03/yet-another-android-ndk-blog-posting.html - forse lo troverete utile.

Buona fortuna.

+0

Grazie guycole! il tuo articolo è davvero completo. –

+0

Esattamente. Anche il tuo post sul blog è ben fatto. Bel tocco che fornisce il codice sorgente per i callback JNI in Java. –

2

Inoltre è dotato di questo registro

??-?? ??:??:??.???: INFO/(): java.lang.UnsatisfiedLinkError: Couldn't load *: findLibrary returned null

giusto ??

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ì.

0

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

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

mia app non stava avendo archiviazione esterna permission.After scrittura aggiungendo il codice qui sotto in manifesta stava funzionando benissimo

Problemi correlati