我正在尝试使用jnr-ffi与 C 库libzbc交互。
有一个功能:
int zbc_list_zones (struct zbc_device * dev, uint64_t 扇区, enum zbc_reporting_options ro, struct zbc_zone ** zone , 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);