1

考虑我有以下 C 结构定义:

struct StructA {
    int a;
    int b;
};

struct StructB {
    struct A *as;
    int count;
};

因此, 的as字段StructB指向一个StructA大小为 's 的数组count。然后,我struct StructA用以下类在 Java 中表示:

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用 Java 表示?由于as不是内联数组,我必须表示as为 a Pointer,那么如何将 JavaStructA[]转换为 a Pointer

4

1 回答 1

1

您需要确保该字段具有指针类型。您可以使用Structure.ByReference(创建实现标记接口的结构类的子类Structure.ByReference)来执行此操作,然后使用Structure.toArray()在该内存上覆盖一个连续的结构数组。

您也可以只使用简单的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);
   }
}
于 2013-07-17T17:18:54.570 回答