Java 指向结构数组的指针
假设我有以下C结构定义:Java 指向结构数组的指针,java,jna,Java,Jna,假设我有以下C结构定义: struct StructA { int a; int b; }; struct StructB { struct A *as; int count; }; 因此,StructB的as字段指向一个大小为count的StructA数组。然后,我用以下类在Java中表示struct-StructA: public class StructA extends Structure { public int a; public
struct StructA {
int a;
int b;
};
struct StructB {
struct A *as;
int count;
};
因此,StructB
的as
字段指向一个大小为count
的StructA
数组。然后,我用以下类在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 { }
}
公共类结构扩展结构{
公共INTA;
公共int b;
公共结构(){
}
公共结构(指针p){
超级(p);
read();
}
@凌驾
受保护列表getFieldOrder(){
返回Arrays.asList(新字符串[]{“a”,“b”});
}
公共静态类引用扩展StructA实现Structure.ByReference{}
公共静态类值扩展StructA实现Structure.ByValue{}
}
但是,我如何用Java表示结构B?由于
as
不是内联数组,我必须将表示为指针,因此如何将JavaStructA[]
转换为指针?您需要确保字段具有指针类型。您可以使用Structure.ByReference
(为实现Structure.ByReference
标记接口的Structure类创建一个子类),然后使用Structure.toArray()
在该内存上覆盖一个连续的struct数组
您也可以只使用一个简单的指针
,但随后需要手动读取/写入结构和相关对象,以及执行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);
}
}
您需要确保字段具有指针类型。您可以使用Structure.ByReference
(为实现Structure.ByReference
标记接口的Structure类创建一个子类),然后使用Structure.toArray()
在该内存上覆盖一个连续的struct数组
您也可以只使用一个简单的指针
,但随后需要手动读取/写入结构和相关对象,以及执行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);
}
}
StructA[]或ArrayList或其他什么东西有什么问题?它仍然是一个引用,您对数组上的项所做的任何更改都会传播到原始类。或者更好的做法是,用ArrayList替换StructB,这就是StructB所做的一切。StructA[]或ArrayList或其他什么东西有什么问题?它仍然是一个引用,您对数组中的项所做的任何更改都会传播到原始类中。或者更好的方法是,用ArrayList替换StructB,这将完成StructB所做的一切。