Appel de méthodes Java à partir de C sous Android : présentation détaillée
L'appel de méthodes Java à partir de C est une tâche courante dans le développement Android. Cet article vise à fournir une solution complète à ce problème en approfondissant le code Java et C et en abordant une erreur courante qui peut survenir au cours de ce processus.
Configuration du code Java
Le code Java fourni définit une classe nommée MainActivity avec une méthode getJniString() qui renvoie une chaîne de C . La méthode messageMe(), que nous avons l'intention d'appeler depuis C , imprime simplement le texte reçu.
<code class="java">public class MainActivity extends Activity { ... public void messageMe(String text) { System.out.println(text); } ... }</code>
Code C
Le code C dans native.cpp tente de trouver la classe MainActivity, de récupérer la méthode messageMe() et de l'invoquer sur l'objet chaîne jstr. Cependant, le message d'erreur "java.lang.NoSuchMethodError: messageMe" indique que la méthode messageMe() n'est pas trouvée.
<code class="cpp">jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){ jstring jstr = env->NewStringUTF("This string comes from JNI"); jclass clazz = env->FindClass("the/package/MainActivity"); jmethodID messageMe = env->GetMethodID(clazz, "messageMe", "(Ljava/lang/String;)V"); env->CallObjectMethod(jstr, messageMe); ... }</code>
Le correctif
L'erreur est dû à deux problèmes :
<code class="cpp">jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){ jstring jstr = env->NewStringUTF("This string comes from JNI"); ... jstring result = env->CallObjectMethod(obj, messageMe, jstr); ... }</code>
Méthode C mise à jour
<code class="cpp">jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){ jstring jstr = env->NewStringUTF("This string comes from JNI"); ... jstring result = env->CallObjectMethod(obj, messageMe, jstr); const char* str = env->GetStringUTFChars(result, NULL); printf("%s\n", str); ... }</code>
Conclusion
En résolvant les problèmes d'invocation d'objet et d'incompatibilité de signature JNI, nous pouvons appeler avec succès la méthode messageMe() à partir du code C.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!