2010-10-27 10 views
19

Ho un'implementazione funzionante della libreria NDK e della corrispondente classe Java. Ma non sono in grado di aggiungere un metodo sovraccarico a quella classe. Attualmente la mia classe contiene:Qual è il modo corretto di scrivere firme dei metodi nativi in ​​NDK Android?

package com.package; 

public class MyClass 
{ 
    public static native String getFileName(); 
    static 
    { 
    System.loadLibrary("mylib"); 
    } 
} 

Il mio file jniwrappers.cpp ha la seguente dichiarazione:

bene
JNIEXPORT jstring JNICALL 
Java_com_package_MyClass_getFileName(_JNIEnv* env, jobject thiz); 

Fino a questo punto tutto sta funzionando. Ma la prossima modifico la mia classe:

package com.package; 

public class MyClass 
{ 
    public static native String getFileName(); 
    public static native String getFileName(int index); 
    ... 
} 

e aggiungere al jniwrappers.cpp un'altra dichiarazione:

JNIEXPORT jstring JNICALL 
Java_com_package_MyClass_getFileName__I(_JNIEnv* env, jobject thiz, jint index); 

Si compila bene, avvia l'applicazione Android, non ottiene UnsatisfiedLinkError ma quando si chiama il secondo metodo con l'argomento viene chiamata la prima funzione C++ ma non la seconda. Ho altri metodi con argomenti in quella classe ma nessuno di essi è sovraccarico, quindi le rispettive firme JNI non contengono argomenti.

Quindi, cosa sto sbagliando?

risposta

20

È necessario aggiungere uno __ alla fine della funzione getFileName originale ora che è sovraccarico. I suoi 2 C prototipi di funzione dovrebbe apparire così:

JNIEXPORT jstring JNICALL Java_com_package_MyClass_getFileName__ 
    (JNIEnv *, jclass); 

JNIEXPORT jstring JNICALL Java_com_package_MyClass_getFileName__I 
    (JNIEnv *, jclass, jint); 
+0

Questa è stata la prima cosa che ho provato ma qualcosa è andato storto e ho UnsatisfiedLinkError. Ora ho ritentato e ho fatto funzionare tutto. Molte grazie! –

25

Si dovrebbe usare javah strumento per generare quelle firme.

Per utilizzarlo, creare il file di classe in cui è presente la funzione native. Otterrai un file class.

Eseguire javah -jni com.organisation.class_with_native_func, genererà un file di intestazione per voi.

È molto più pulito che modificarlo da solo.

+3

Grazie, è quello che dovrei usare. Ma conoscere gli interni è molto utile. –

+0

Oppure usa semplicemente l'opzione della riga di comando -classpath per dirigere javah nella directory in cui è compilato il file di classe (es .: 'javah -classpath/percorso/in/jar -jni com.package.name.YourClass'). –

Problemi correlati