Aufrufen von Java-Methoden aus nativem C in Android
Bei der Integration von Java- und C-Code in Android kann es notwendig werden, Java-Methoden aus aufzurufen nativer C-Code. Dieser Artikel befasst sich mit einem spezifischen Problem, das beim Versuch auftritt, eine Java-Methode namens „messageMe“ aus nativem Code innerhalb der „getJniString“-Methode aufzurufen.
Im bereitgestellten Codeausschnitt versucht der Entwickler, „messageMe“ aus nativem Code aufzurufen C innerhalb der Methode „getJniString“. Die Kompilierung schlägt jedoch mit der Ausnahme „NoSuchMethodError“ fehl, was darauf hinweist, dass der Methodenname falsch ist.
Das Problem liegt in der Art und Weise, wie die Methode „messageMe“ im nativen Code aufgerufen wird:
<code class="cpp">jobject result = env->CallObjectMethod(jstr, messageMe);</code>
Hier stellt die Variable „jstr“ das Java-Objekt dar, für das die Methode aufgerufen werden soll, und „messageMe“ bezieht sich auf die Methoden-ID. Da „messageMe“ jedoch eine Methode der Klasse „MainActivity“ ist (wie im Java-Code definiert), kann sie nicht direkt an „CallObjectMethod“ übergeben werden, da dies dem Aufruf von „jstr.myMethod()“ gleichkäme falsch.
Um dieses Problem zu beheben, sollte der native Code die Variable „obj“, die die Instanz der Klasse „MainActivity“ darstellt, wie folgt an „CallObjectMethod“ übergeben:
<code class="cpp">jobject result = env->CallObjectMethod(obj, messageMe);</code>
Wenn außerdem die Methode „messageMe“ als void definiert ist (wie im angegebenen Code), sollte „CallVoidMethod“ anstelle von „CallObjectMethod“ verwendet werden:
<code class="cpp">env->CallVoidMethod(obj, messageMe, jstr);</code>
Wenn ein Ergebnis von erwartet wird Bei der Methode „messageMe“ müssen der Java-Code und die JNI-Signatur geändert werden, um einen Wert zurückzugeben.
Das obige ist der detaillierte Inhalt vonWarum erhalte ich einen „NoSuchMethodError', wenn ich eine Java-Methode aus nativem C in Android aufrufe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!