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

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

Barbara Streisand
发布: 2024-11-03 15:30:03
原创
565 人浏览过

Why am I getting a

在 Android 中从 Native C 调用 Java 方法

在 Android 中集成 Java 和 C 代码时,可能需要从 Android 中调用 Java 方法本机 C 代码。本文解决了尝试从“getJniString”方法中的本机代码调用名为“messageMe”的 Java 方法时遇到的特定问题。

在提供的代码片段中,开发人员尝试从本机调用“messageMe” C 内的“getJniString”方法。但是编译失败,出现“NoSuchMethodError”异常,说明方法名不正确。

问题出在原生代码中调用“messageMe”方法的方式:

<code class="cpp">jobject result = env->CallObjectMethod(jstr, messageMe);</code>
登录后复制

这里,“jstr”变量代表要调用该方法的Java对象,“messageMe”指的是方法ID。但是,由于“messageMe”是“MainActivity”类的一个方法(如Java代码中所定义),因此它不能直接传递给“CallObjectMethod”,因为它相当于调用“jstr.myMethod()”,即不正确。

要解决此问题,本机代码应将表示“MainActivity”类实例的“obj”变量传递给“CallObjectMethod”,如下所示如下:

<code class="cpp">jobject result = env->CallObjectMethod(obj, messageMe);</code>
登录后复制

此外,如果“messageMe”方法被定义为 void(如给定代码中所示),则应使用“CallVoidMethod”而不是“CallObjectMethod”:

<code class="cpp">env->CallVoidMethod(obj, messageMe, jstr);</code>
登录后复制

如果希望“messageMe”方法返回结果,则需要修改 Java 代码和 JNI 签名以返回值。

以上是为什么在 Android 中从本机 C 调用 Java 方法时会收到'NoSuchMethodError”?的详细内容。更多信息请关注PHP中文网其他相关文章!

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