Heim  >  Artikel  >  Backend-Entwicklung  >  Wie rufe ich eine Java-Methode von Native C in Android korrekt auf?

Wie rufe ich eine Java-Methode von Native C in Android korrekt auf?

DDD
DDDOriginal
2024-11-03 20:33:29305Durchsuche

How to Correctly Call a Java Method from Native C   in Android?

Aufrufen einer Java-Methode aus C in Android

In der Android-Entwicklung ist die Integration nativer C-Funktionen mit Java-Komponenten eine häufige Anforderung. Dieser Artikel befasst sich mit einem spezifischen Problem, das auftritt, wenn versucht wird, eine Java-Methode aus C aufzurufen.

Problem:

Beim Versuch, eine Java-Methode aufzurufen, insbesondere messageMe, Aus nativem Code während der Ausführung der getJniString-Methode stößt die Anwendung auf einen NoSuchMethodError Ausnahme.

Java-Code:

<code class="java">public class MainActivity extends Activity {
    // ... (Java code to setup and load native library)

    public void messageMe(String text) {
        System.out.println(text);
    }
    // ... (Other Java code)
}</code>

Nativer C-Code (native.cpp):

<code class="c++">// ... (Native C++ code to create a Java String)

// Get the class and method with the incorrect invocation
jclass clazz = env->FindClass("the/package/MainActivity");
jmethodID messageMe = env->GetMethodID(clazz, "messageMe", "(Ljava/lang/String;)V");
jobject result = env->CallObjectMethod(jstr, messageMe); // Incorrect invocation

// Corrected invocation
jobject result = env->CallObjectMethod(obj, messageMe, jstr);</code>

Lösung:

Der Fehler entsteht durch einen falschen Aufruf des CallObjectMethod-Funktion im nativen C-Code. Um eine Instanzmethode aufzurufen, müssen Sie das Objekt als Argument an die Methode übergeben. In diesem Fall ist das Objekt obj, das die Instanz der Java-Klasse darstellt.

Der korrigierte Aufruf sollte wie folgt lauten:

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

Das obige ist der detaillierte Inhalt vonWie rufe ich eine Java-Methode von Native C in Android korrekt auf?. 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