JNR-FFI如何从指针到指针读取结构数组

时间:2017-10-29 10:00:35

标签: java c struct ffi jnr

我正在尝试使用libzbc与C库jnr-ffi进行交互。

有一个功能:

  

int zbc_list_zones(struct zbc_device * dev,uint64_t sector,enum   zbc_reporting_options ro, struct zbc_zone ** zones ,unsigned int *     nr_zones)

如何从参数区域中读回结构数组?

第二个问题:nr_zones参数是否正确声明?得到的整数是负数,应该是正数。我尝试使用 ShortByReference ,给出了合理的结果,但我认为这不正确。

我尝试了以下内容来读取第一个元素,但它不起作用(给出零结果):

PointerByReference zones=new PointerByReference();
IntByReference nr_zones=new IntByReference();
zbc_zone zone=new zbc_zone(runtime);
z.zbc_list_zones(dev, 0, zbc_reporting_options.ZBC_RO_ALL, zones, nr_zones);
zone.useMemory(zones.getValue());
System.out.println("zone 0: "+zone.zbz_length);

zbc_zone结构:

public static class zbc_zone extends Struct 
{
    protected zbc_zone(Runtime runtime) {
        super(runtime);
    }
    public final Unsigned64 zbz_length=new Unsigned64();
    public final Unsigned64 zbz_start=new Unsigned64();
    public final Unsigned64 zbz_write_pointer=new Unsigned64();
    public final Unsigned8 zbz_type=new Unsigned8();
    public final Unsigned8 zbz_conditions=new Unsigned8();
    public final Unsigned8 zbz_attributes=new Unsigned8();
    public final Unsigned8 zbz_pad1=new Unsigned8();
    public final Unsigned8 zbz_pad2=new Unsigned8();
    public final Unsigned8 zbz_pad3=new Unsigned8();
    public final Unsigned8 zbz_pad4=new Unsigned8();
    public final Unsigned8 zbz_pad5=new Unsigned8();
}

JNR界面:

public int zbc_list_zones(@In Pointer dev,@In long sector,
    @In zbc_reporting_options options,@Out PointerByReference zones,
    @Out IntByReference nr_zones);

1 个答案:

答案 0 :(得分:1)

有三种方法可以帮助您:

  1. Pointer#slice - 将返回一个按偏移量移动的新指针。
  2. Struct#size - 以字节为单位返回struct的大小。
  3. Struct#useMemory - 将内存映射到struct fields。
  4. 所以你应该创建一个结构,记住它的大小,并为原始指针中的每个i切片i *大小,并在创建的结构中使用新指针的内存。