首页 > 后端开发 > C++ > 正文

在 Android 中从 C 调用 Java 方法时如何修复'java.lang.NoSuchMethodError: messageMe\”?

Linda Hamilton
发布: 2024-11-03 12:15:02
原创
889 人浏览过

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签名不匹配的问题,我们可以成功调用messageMe() C 代码中的方法。

以上是在 Android 中从 C 调用 Java 方法时如何修复'java.lang.NoSuchMethodError: messageMe\”?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板