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