参考资料:
JNI官方中文资料.
JNI 返回结构体参数的方法.
JNI返回自定义结构体数组到Java.
C++代码中有一个结构体,想将其作为本地函数的返回值传递给JAVA,那么要写一个自定义的JAVA类,其成员和该结构体一一对应。(C++中的unsigned char*等单字节的类型,JAVA中可以写为byte[])(类型的对应要注意字节数相等)
接下来分几步在C++中构建JAVA对象作为返回值:(省略返回值、参数,函数的用法的细节详见参考资料)
1.获取定义好的类:
jclass FindClass()
2.获取该类的构造函数ID:
jmethodID GETMethodID()
3.新建类对象:(即为返回值)
jobject NewObject()
4.获取类的域的ID:(这里的域有时为一个jobject对象,如String对象,以及下文中说到的数组)
jfield GetFieldID()
5.设置对应ID的域的值:(设置为C++中结构体成员的值)
set<type>Field()
结构体成员为数组的处理办法
*JAVA数组实质是一个类对象
所以可以将数组作为一个jobject对象处理,注意两点:
1.GetFieldID()最后一个参数(类型签名)为:“[数组类型对应的签名”。(如int[]数组对应的签名为"[I”,byte[]数组对应的签名为"[B")
2.上文中的第5步用SetObjectField(),其最后一个参数(jobject对象)的类型为:j数组类型Array(它是jobject的子类,所以参数类型兼容)