首頁  >  文章  >  後端開發  >  在 Android 中從 C 呼叫 Java 方法時如何修復“java.lang.NoSuchMethodError: messageMe\”?

在 Android 中從 C 呼叫 Java 方法時如何修復“java.lang.NoSuchMethodError: messageMe\”?

Linda Hamilton
Linda Hamilton原創
2024-11-03 12:15:02891瀏覽

How to Fix

在 Android 中從 C 呼叫 Java 方法:詳細演練

從 C 呼叫 Java 方法是 Android 開發中常見的任務。本文旨在透過深入研究 Java 和 C 程式碼並解決此過程中可能出現的常見錯誤,為該問題提供全面的解決方案。

Java 程式碼設定

提供的 Java 程式碼定義了一個名為 MainActivity 的類,其方法 getJniString() 從 C 傳回一個字串。我們打算從 C 呼叫 messageMe() 方法,它只是列印接收到的文字。

<code class="java">public class MainActivity extends Activity {
    ...
    public void messageMe(String text) {
        System.out.println(text);
    }
    ...
}</code>

C 程式碼

native.cpp 中的C 程式碼嘗試找出MainActivity 類,檢索messageMe() 方法,並在jstr 字串物件上呼叫它。但是,錯誤訊息「java.lang.NoSuchMethodError: messageMe」表示未找到 messageMe() 方法。

<code class="cpp">jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){
    jstring jstr = env->NewStringUTF("This string comes from JNI");
    jclass clazz = env->FindClass("the/package/MainActivity");
    jmethodID messageMe = env->GetMethodID(clazz, "messageMe", "(Ljava/lang/String;)V");
    env->CallObjectMethod(jstr, messageMe);
    ...
}</code>

修正

錯誤是由兩個問題引起的:

  • 不正確的物件呼叫: messageMe() 方法需要一個物件引用,該引用應作為第一個參數傳遞給CallObjectMethod()。錯誤的程式碼直接呼叫了jstr上的方法,這是無效的。
  • 無效的JNI簽章: C程式碼使用(Ljava/lang/String;)V作為messageMe(的簽章) 方法,表示它傳回 void。然而,實際的 Java 方法傳回一個 String 值。要解決此問題,請將C 程式碼變更為:
<code class="cpp">jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){
    jstring jstr = env->NewStringUTF("This string comes from JNI");
    ...
    jstring result = env->CallObjectMethod(obj, messageMe, jstr);
    ...
}</code>

更新的C 方法

<code class="cpp">jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){
    jstring jstr = env->NewStringUTF("This string comes from JNI");
    ...
    jstring result = env->CallObjectMethod(obj, messageMe, jstr);
    const char* str = env->GetStringUTFChars(result, NULL);
    printf("%s\n", str);
    ...
}</code>

結論結論

透過解決物件呼叫和JNI簽章不符的問題,我們可以成功地從C程式碼中呼叫messageMe()方法。

以上是在 Android 中從 C 呼叫 Java 方法時如何修復“java.lang.NoSuchMethodError: messageMe\”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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