在 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签名不匹配的问题,我们可以成功调用messageMe() C 代码中的方法。
以上是在 Android 中从 C 调用 Java 方法时如何修复'java.lang.NoSuchMethodError: messageMe\”?的详细内容。更多信息请关注PHP中文网其他相关文章!