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

Use*_*337 12 java java-native-interface android

如何在GetMethodID函数签名参数中指定我获取的函数id是否接受自定义类的数组?

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

void getData( ListDataClass[] arryData )
Run Code Online (Sandbox Code Playgroud)

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

"([myPackeg/ListDataClass)V"
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我得到例外Method Not Found.如果我指定字符串类的数组,同样的事情.

Goo*_*bus 30

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

Lclass/path/ClassName;
Run Code Online (Sandbox Code Playgroud)

例如:

"Ljava/lang/String;" // String
"[Ljava/lang/String;" // String[] (array)
Run Code Online (Sandbox Code Playgroud)

方法签名是通过首先在括号内放置参数而在右括号后放置返回类型来建立的.例如:

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

你可以在这里找到JNI类型签名的文档,这是我借用上面的例子的地方.

在您的具体示例中:

void getData( ListDataClass[] arryData ) // Java method
"([Lclass/path/ListDataClass;)V" // JNI type signature
Run Code Online (Sandbox Code Playgroud)

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

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

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