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