Maison  >  Article  >  développement back-end  >  Pourquoi est-ce que je reçois une erreur « NoSuchMethodError » lorsque j'appelle une méthode Java à partir de C sous Android ?

Pourquoi est-ce que je reçois une erreur « NoSuchMethodError » lorsque j'appelle une méthode Java à partir de C sous Android ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-03 21:23:29972parcourir

Why am I getting a

Appel d'une méthode Java depuis C dans Android : surmonter les exceptions Java

Dans le développement Android, appeler une méthode Java depuis C peut être simple. Cependant, vous pouvez rencontrer l'exception "NoSuchMethodError" si vous ne faites pas attention.

Le code Java

Commençons par examiner le code Java :

<code class="java">public class MainActivity extends Activity {
    //...

    public void messageMe(String text) {
        System.out.println(text);
    }

    //...
}</code>

Ce code définit une méthode appelée "messageMe" qui prend une chaîne comme argument.

Le code C

Maintenant, regardons le code C code qui tente d'appeler "messageMe":

<code class="cpp">jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){
    //...

    // Get the method that you want to call
    jmethodID messageMe = env->GetMethodID(clazz, "messageMe", "(Ljava/lang/String;)V");

    //...

    jobject result = env->CallObjectMethod(jstr, messageMe);
    //...
}</code>

Dans ce code, le problème réside dans la fonction "CallObjectMethod". Cette méthode nécessite que le paramètre "obj" soit l'objet sur lequel la méthode est appelée. Cependant, dans le code donné, il utilise "jstr" à la place, qui est la chaîne transmise à la méthode.

La solution

Pour résoudre ce problème, vous devez pour transmettre l'objet correct comme premier argument à "CallObjectMethod":

<code class="cpp">jobject result = env->CallObjectMethod(obj, messageMe, jstr);</code>

De plus, puisque "messageMe" est une méthode vide, vous devez appeler "CallVoidMethod" au lieu de "CallObjectMethod". N'oubliez pas non plus de modifier la signature JNI et le code Java pour qu'ils correspondent au nouveau type de retour.

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!

Déclaration:
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