Maison > développement back-end > C++ > le corps du texte

Comment réparer \'java.lang.NoSuchMethodError: messageMe\' lors de l'appel de méthodes Java à partir de C sous Android ?

Linda Hamilton
Libérer: 2024-11-03 12:15:02
original
904 Les gens l'ont consulté

How to Fix

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>
Copier après la connexion

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>
Copier après la connexion

Le correctif

L'erreur est dû à deux problèmes :

  • Invocation d'objet incorrecte : La méthode messageMe() nécessite une référence d'objet, qui doit être transmise comme premier argument à CallObjectMethod(). Le code incorrect appelle directement la méthode sur jstr, ce qui n'est pas valide.
  • Signature JNI invalide : Le code C utilise (Ljava/lang/String;)V comme signature pour messageMe( ), indiquant qu'elle renvoie void. Cependant, la méthode Java réelle renvoie une valeur String. Pour résoudre ce problème, modifiez le code C en :
<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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal