如何在 JNA 的“结构”中正确初始化数组字段?
How do I properly initialize array fields within a `Structure` in JNA?
我在 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() {}
}
}
大结构:
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?
定义Structure
字段时,JNA默认是按值语义,所以你可以直接使用Structure
。
由您来初始化 Structure
中的任何数组字段,因为 JNA 无法知道您希望它们有多大。
public class SmallStruct extends Structure {
public int a[] = new int[128];
}
请注意,在您调用 Structure.read()
或 Structure.write()
之前,这些数组的内容不会与本机内存同步(当您调用使用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() {}
}
}
大结构:
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?
定义Structure
字段时,JNA默认是按值语义,所以你可以直接使用Structure
。
由您来初始化 Structure
中的任何数组字段,因为 JNA 无法知道您希望它们有多大。
public class SmallStruct extends Structure {
public int a[] = new int[128];
}
请注意,在您调用 Structure.read()
或 Structure.write()
之前,这些数组的内容不会与本机内存同步(当您调用使用Structure
参数)。