JNA参数传递问题,Java数组版权声明:本⽂为博主原创⽂章,未经博主允许不得转载。
本⽂主要讲述使⽤JNA模拟结构体并将结构体数组作为参数传递给对应的⽅法。
C语⾔结构体定义如下:
[cpp]
1. typedef struct Rect
2. {
3. int top;
4. int bottom;
5. int left;
6. int right;
7. } RECT;
JNA模拟该结构体:
需要引⼊:
import com.sun.jna.*;
import com.sun.jna.ptr.*;
[java]
1. //Rect结构体
2. public static class Rect extends Structure {
3. //Structure⼦类中的公共字段的顺序,必须与C语⾔中的结构的顺序⼀致,否则会报错!
4. public int top;
5. public int bottom;
6. public int left;
7. public int right;
8.
9. public static class ByReference extends Rect implements Structure.ByReference {}
10. public static class ByValue extends Rect implements Structure.ByValue {}
11.
12. @Override
13. protected List getFieldOrder() {
14. return Arrays.asList(new String[]{"top", "bottom", "left", "right"});
15. }
16. }
现在要给⽅法传递⼀个结构体数组对象,如何做呢?
C语⾔函数:
[cpp]
1. //rects:结构体数组,len:数组长度
2. void function(RECT* rects, int len);
JNA模拟如下:
[java]
1. void function(Rect[] rects,int len);
创建数组及调⽤⽅法如下:
[java]
1. int len = 5;
2. //定义数组
3. Rect[] array = (Rect[])new Rect().toArray(len);
4. function(array, len);
注意,这⾥创建数组使⽤了JNA的toArray()⽅法,⽽不是常规创建数组的⽅法,是因为内存空间在java中是不连续的,jna定义数组是需要使⽤toArray⽅法,这样实例化出来的数组内存空间是连续的。
其实这⾥主要是创建结构体数组的地⽅要注意,如果使⽤下⾯的⽅式创建,那就会产⽣⼀个空的数组,申请不到空间:
[java]
1. int len = 5;
2. Rect[] array = new Rect[len];
这个代码执⾏后,array=null,也就是创建数组失败了!
结构体数组不能作为参数传递给函数原因:内存空间在java中是不连续的,jna定义数组是需要使⽤toArray⽅法,这样实例化出来的数组内存空间是连续的,否则数据第⼀条是正确的,其他是错位的。
blog.csdn/zht666/article/details/38658985 //原⽂地址
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论