考虑我有以下C结构定义:
struct StructA {
int a;
int b;
};
struct StructB {
struct A *as;
int count;
};
因此,as
的{{1}}字段指向大小为StructB
的{{1}}数组。然后,我使用以下类在Java中表示StructA
:
count
但是,我如何在Java中表示struct StructA
?由于public class StructA extends Structure {
public int a;
public int b;
public StructA() {
}
public StructA(Pointer p) {
super(p);
read();
}
@Override
protected List<String> getFieldOrder() {
return Arrays.asList(new String[]{"a", "b"});
}
public static class Reference extends StructA implements Structure.ByReference { }
public static class Value extends StructA implements Structure.ByValue { }
}
不是内联数组,因此我必须将struct B
表示为as
,那么如何将Java as
转换为Pointer
?
答案 0 :(得分:1)
您需要确保该字段具有指针类型。您可以使用Structure.ByReference
(创建实现Structure.ByReference
标记接口的结构类的子类)执行此操作,然后使用Structure.toArray()
在该内存上覆盖连续的struct数组。
您也可以使用简单的Pointer
,但是您需要手动读取/写入结构和相关对象,以及执行JNA通常为您执行的本机内存同步。
例如:
class StructA {
public static class ByReference extends StructA implements Structure.ByReference { }
}
class StructB {
public StructA.ByReference sa;
public int size;
public StructA[] getMembers() {
return (StructA[])sa.toArray(this.size);
}
}