首页 > 后端开发 > C++ > 为什么在 Android 中从 C 调用 Java 方法时会收到'NoSuchMethodError”?

为什么在 Android 中从 C 调用 Java 方法时会收到'NoSuchMethodError”?

Patricia Arquette
发布: 2024-11-03 21:23:29
原创
1035 人浏览过

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中文网其他相关文章!

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