我在C中有一个Struct我希望用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?
答案 0 :(得分:1)
定义Structure
字段时,JNA默认按值语义,因此您只能使用Structure
。
由您来初始化Structure
中的任何数组字段,因为JNA无法知道您希望它们有多大。
public class SmallStruct extends Structure {
public int a[] = new int[128];
}
请注意,在调用Structure.read()
或Structure.write()
之前,这些数组的内容不会与本机内存同步(当您调用使用{{Structure
的本机方法时,这些调用由JNA自动执行。 1}}参数)。