Java 指向结构数组的指针

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

假设我有以下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 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
不是内联数组,我必须将
表示为
指针,因此如何将Java
StructA[]
转换为
指针?

您需要确保字段具有指针类型。您可以使用
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所做的一切。