本文主要讲述使用JNA模拟结构体并将结构体数组作为参数传递给对应的方法。
C语言结构体定义如下:
typedef struct Rect { int top; int bottom; int left; int right; } RECT;
JNA模拟该结构体:
需要引入:
import com.sun.jna.*;
import com.sun.jna.ptr.*;
//Rect结构体 public static class Rect extends Structure { //Structure子类中的公共字段的顺序,必须与C语言中的结构的顺序一致,否则会报错! public int top; public int bottom; public int left; public int right; public static class ByReference extends Rect implements Structure.ByReference {} public static class ByValue extends Rect implements Structure.ByValue {} @Override protected List getFieldOrder() { return Arrays.asList(new String[]{"top", "bottom", "left", "right"}); } }
现在要给方法传递一个结构体数组对象,如何做呢?
C语言函数:
//rects:结构体数组,len:数组长度 void function(RECT* rects, int len);
JNA模拟如下:
void function(Rect[] rects,int len);
调用方法如下:
int len = 5; //定义数组 Rect[] array = (Rect[])new Rect().toArray(len); function(array, len);
其实这里主要是创建结构体数组的地方要注意:如果使用下面的方式创建,那就会产生一个空的数组,申请不到空间,现在暂时不知道为什么申请不到空间。
int len = 5; Rect[] array = new Rect[len];
这个代码执行后,array=null,也就是创建数组失败了!
希望高手能够帮助解答!
JNA结构体数组
时间: 2024-10-06 18:41:27