java - 如何在 GetMethodID 方法签名参数中指定类的数组?

标签 java android java-native-interface

如何在 GetMethodID 函数签名参数中指定我为其获取 ID 的函数接受自定义类的数组?

我在 java 中有一个带有签名的函数:

void getData( ListDataClass[] arryData )

我想使用 GetMethodID 函数从 JNI 接口(interface)获取此函数的方法 ID。
为此,我在函数签名参数中提到如下:

"([myPackeg/ListDataClass)V"

但这是行不通的,我得到异常 Method Not Found。如果我指定字符串类数组,同样的事情会起作用。

最佳答案

完全限定类的 JNI 类型签名采用以下形式:

Lclass/path/ClassName;

例如:

"Ljava/lang/String;" // String
"[Ljava/lang/String;" // String[] (array)

方法签名是通过首先将参数放在括号内,然后将返回类型放在右括号内来构建的。例如:

long f (int n, String s, int[] arr); // Java method
"(ILjava/lang/String;[I)J" // JNI type signature

您可以找到 JNI 类型签名的文档 here ,这是我借用上面例子的地方。

在您的具体示例中:

void getData( ListDataClass[] arryData ) // Java method
"([Lclass/path/ListDataClass;)V" // JNI type signature

注意:确切的类型签名取决于您的类路径。

然后您可以找到方法 ID,如下所示(假设 C++ 和一个名为 env 的 JNIEnv 指针):

jclass clz = env->FindClass("class/path/ListDataClass");
jmethodID mid = env->GetMethodID(clz, "getData", "([Lclass/path/ListDataClass;)V");

关于java - 如何在 GetMethodID 方法签名参数中指定类的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9433257/

相关文章:

android - 在 Android 应用程序上捐款

java-native-interface - 在 Cygwin 上使用 Java/JNI

java - 从 Eclipse 查看 native 代码

android - 使用 ffmpeg 播放带有音轨的 mp3 数据

java - Jetty 服务器在关闭终端窗口后停止运行

java - 在 GroupLayout 中创建页脚

android - android_winusb.inf 中的 SingleAdbInterface、CompositeAdbInterface 和 SingleBootLoaderInterface 是什么

java - 命令提示符中不存在包

java - 如何在 BottomNavigationView 中的项目上设置长按监听器?

android - 如何使用带有 ListView 而不是 Recycler View 的折叠工具栏