在Android 中從Native C 呼叫Java 方法
在Android 中整合Java 和C 程式碼時,可能需要從Android 中呼叫Java方法本機C 碼。本文解決了嘗試從「getJniString」方法中的本機程式碼呼叫名為「messageMe」的 Java 方法時遇到的特定問題。
在提供的程式碼片段中,開發人員嘗試從本機呼叫「messageMe」 C 內的「getJniString」方法。但是編譯失敗,出現「NoSuchMethodError」異常,表示方法名稱不正確。
問題出在原生程式碼中呼叫「messageMe」方法的方式:
<code class="cpp">jobject result = env->CallObjectMethod(jstr, messageMe);</code>
這裡,「jstr」變數代表要呼叫該方法的Java對象,「messageMe」指的是方法ID。但是,由於“messageMe”是“MainActivity”類別的一個方法(如Java程式碼中所定義),因此它不能直接傳遞給“CallObjectMethod”,因為它相當於呼叫“jstr.myMethod()”,即不正確。
要解決此問題,本機程式碼應將表示“MainActivity”類別實例的“obj”變數傳遞給“CallObjectMethod”,如下所示:
<code class="cpp">jobject result = env->CallObjectMethod(obj, messageMe);</code>
此外,如果“ messageMe”方法被定義為void(如給定程式碼所示),則應使用「CallVoidMethod」而不是「CallObjectMethod」:
<code class="cpp">env->CallVoidMethod(obj, messageMe, jstr);</code>
如果預期結果來自「messageMe」方法,需要修改Java 程式碼和JNI 簽章才能傳回值。
以上是為什麼在 Android 中從本機 C 呼叫 Java 方法時會收到「NoSuchMethodError」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!