java如何正确初始化JNA中“Structure”中的数组字段?
我有一个C结构,我想用JNA在java中表示:
typedef struct SmallStrcut {
unit32_t a[128];
}
typedef struct BigStruct {
SmallStruct b;
SmallStruct c;
}
以及以下功能:
void getBigStruct(BigStruct bigStruct);
我在Java中有以下结构:
SmallStruct:
public class SmallStruct extends Structure {
public static ByValue extends SmallStruct implements Structure.ByValue {
public int a[];
public ByValue() {}
}
}
BigStruct:
public class BigStruct extends Structure {
public static ByValue extends BigStruct implements Structure.ByValue {
public SmallStruct b;
public SmallStruct c;
public ByValue() {}
}
这是我的主要观点:
BigStruct.ByValue big = new BigStruct.ByValue();
SmallStruct.ByValue x1 = new SmallStruct.ByValue();
x1.a = new int[128];
x1.a[0] = 123;
SmallStruct.ByValue x2 = new SmallStruct.ByValue();
x2.a = new int[128];
x2.a[0] = 456;
big.b = x1;
big.c = x2;
当我调试这段代码时,我观察了BigStruct对象,只有
b成员已初始化。c数组全部为零
它就像第一个SmallStruct对第二个SmallStruct内存区域进行验证一样
如何传输两个SmallStruct以正确构造BigStruct
# 1 楼答案
定义
Structure
字段时,JNA默认为按值语义,因此您可以只使用Structure
初始化
Structure
中的任何数组字段取决于您,因为JNA无法知道您希望它们有多大请注意,在调用
Structure.read()
或Structure.write()
之前,这些数组的内容不会与本机内存同步(当您调用使用Structure
参数的本机方法时,JNA会自动执行这些调用)