首頁  >  文章  >  後端開發  >  為什麼在 Android 中從本機 C 呼叫 Java 方法時會收到「NoSuchMethodError」?

為什麼在 Android 中從本機 C 呼叫 Java 方法時會收到「NoSuchMethodError」?

Barbara Streisand
Barbara Streisand原創
2024-11-03 15:30:03507瀏覽

Why am I getting a

在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn