Heim  >  Artikel  >  Backend-Entwicklung  >  Wie behebt man „java.lang.NoSuchMethodError: messageMe“ beim Aufrufen von Java-Methoden aus C in Android?

Wie behebt man „java.lang.NoSuchMethodError: messageMe“ beim Aufrufen von Java-Methoden aus C in Android?

Linda Hamilton
Linda HamiltonOriginal
2024-11-03 12:15:02894Durchsuche

How to Fix

Aufrufen von Java-Methoden aus C in Android: Eine detaillierte Anleitung

Das Aufrufen von Java-Methoden aus C ist eine häufige Aufgabe in der Android-Entwicklung. Dieser Artikel soll eine umfassende Lösung für dieses Problem bieten, indem er sich mit dem Java- und C-Code befasst und einen häufigen Fehler anspricht, der während dieses Prozesses auftreten kann.

Java-Code-Setup

Der bereitgestellte Java-Code definiert eine Klasse namens MainActivity mit einer Methode getJniString(), die einen String aus C zurückgibt. Die Methode messageMe(), die wir von C aus aufrufen möchten, gibt einfach den empfangenen Text aus.

<code class="java">public class MainActivity extends Activity {
    ...
    public void messageMe(String text) {
        System.out.println(text);
    }
    ...
}</code>

C-Code

Der C-Code in native.cpp versucht, die MainActivity-Klasse zu finden, die messageMe()-Methode abzurufen und sie für das jstr-String-Objekt aufzurufen. Die Fehlermeldung „java.lang.NoSuchMethodError: messageMe“ weist jedoch darauf hin, dass die messageMe()-Methode nicht gefunden wurde.

<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>

Der Fix

Der Fehler wird durch zwei Probleme verursacht:

  • Falscher Objektaufruf: Die Methode messageMe() erfordert eine Objektreferenz, die als erstes Argument an CallObjectMethod() übergeben werden sollte. Der falsche Code ruft die Methode direkt auf jstr auf, was ungültig ist.
  • Ungültige JNI-Signatur: Der C-Code verwendet (Ljava/lang/String;)V als Signatur für messageMe( )-Methode, was darauf hinweist, dass sie „void“ zurückgibt. Die eigentliche Java-Methode gibt jedoch einen String-Wert zurück. Um dies zu beheben, ändern Sie den C-Code in:
<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>

Aktualisierte C-Methode

<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>

Schlussfolgerung

Durch die Behebung der Probleme beim Objektaufruf und der Nichtübereinstimmung der JNI-Signaturen können wir die messageMe()-Methode erfolgreich aus dem C-Code aufrufen.

Das obige ist der detaillierte Inhalt vonWie behebt man „java.lang.NoSuchMethodError: messageMe“ beim Aufrufen von Java-Methoden aus C in Android?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn