在 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>
修正
錯誤是由兩個問題引起的:
<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中文網其他相關文章!