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

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

Patricia Arquette
Patricia Arquette原創
2024-11-03 21:23:291088瀏覽

Why am I getting a

在 Android 中從 C 呼叫 Java 方法:克服 Java 異常

在 Android 開發中,從 C 呼叫 Java 方法非常簡單。但是,如果不小心,可能會遇到“NoSuchMethodError”異常。

Java 程式碼

讓我們從檢查Java 程式碼開始:

<code class="java">public class MainActivity extends Activity {
    //...

    public void messageMe(String text) {
        System.out.println(text);
    }

    //...
}</code>

這段程式碼定義了一個名為「messageMe」的方法,它接受一個字串作為參數。

C 程式碼

現在,讓我們看看C 程式碼嘗試呼叫「messageMe」的程式碼:

<code class="cpp">jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){
    //...

    // Get the method that you want to call
    jmethodID messageMe = env->GetMethodID(clazz, "messageMe", "(Ljava/lang/String;)V");

    //...

    jobject result = env->CallObjectMethod(jstr, messageMe);
    //...
}</code>

在此程式碼中,問題出在「CallObjectMethod」函數。此方法要求“obj”參數是呼叫該方法的物件。但是,在給定的程式碼中,它使用“jstr”,這是傳遞給方法的字串。

解決方案

要解決此問題,您需要將正確的物件作為第一個參數傳遞給「CallObjectMethod」:

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

此外,由於“messageMe”是一個void 方法,因此您應該呼叫“CallVoidMethod”而不是“CallObjectMethod”。另外,請記住更改 JNI 簽名和 Java 程式碼以匹配新的返回類型。

以上是為什麼在 Android 中從 C 呼叫 Java 方法時會收到「NoSuchMethodError」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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