2011-05-23 7 views
5

J'ai compilé mes sources c avec android-ndk puis j'ai mis le fichier .so dans le dossier libs de mon projet android mais quand j'appelle la fonction native j'ai une erreur "No implementation found for native" . Si j'essaie d'appeler cette fonction à partir de shell adb tout fonctionne bien donc je ne comprends pas pourquoi cette erreur. Veuillez aider, AndreaAucune implémentation trouvée pour natif

Répondre

14

Il existe un schéma de nommage exact impliqué dans JNI qui n'est pas très évident. Peut-être que l'implémentation de votre fonction ne s'y conforme pas? Par exemple, si vous voulez pouvoir appeler une fonction native appelée startServer à partir de votre code JAVA, en supposant que votre paquet s'appelle com.example.something et que votre classe s'appelle MyClass, vous devriez avoir une fonction membre dans votre classe JAVA comme ceci:

private native void startServer(); 

Et puis votre implémentation de JNI devrait ressembler à ceci:

JNIEXPORT void Java_com_example_something_MyClass_startServer(JNIEnv *env, jobject obj) { 

// Do something here... 

} 

Sinon, il y a une erreur de liaison.

+0

mon paquet est: package upmt.os; et la fonction: public static natif String upmtconf (String [] param); dans la classe Module. Dans le code c l'implémentation est JNIEXPORT jstring JNICALL Java_upmt_os_Module_upmtconf (JNIEnv * env, jobject obj, paramètre jobjectArray) –

+0

Publiez la sortie logcat pour appeler votre fonction - elle a le nom exact recherché par le linker. Si vous avez une sorte de faute de frappe c'est un bon moyen de l'attraper. – gby

+0

Je l'ai résolu. c'était seulement une erreur dans le makefile avec un define. merci quand même –

12

Une autre raison, vous pouvez obtenir cela, est si vous n'êtes pas d'appeler votre bibliothèque au moment où vous faites un appel de fonction JNI:

static { 
    System.loadLibrary("myJNIFILE"); 
} 

devrait être appelé quelque part avant la référence réelle à une fonction JNI.

+0

Vous avez totalement raison! J'ai eu une application qui fonctionne correctement, mais j'ai ajouté des écrans initiaux supplémentaires (vues) et les plantages de l'application (j'ai reçu un avertissement JNI se plaignant de l'impossibilité de trouver une méthode "native"). Enfin, j'ai déplacé l'appel: \t static { \t \t System.loadLibrary ("mylibrary"); \t} dans l'activité responsable du lancement de l'application. – Genar

Questions connexes