JNR-FFI, как читать массив структур из указателя в указатель
Я пытаюсь взаимодействовать с библиотекой C libzbc, используя jnr-ffi.
Есть функция:
int zbc_list_zones (struct zbc_device * dev, сектор uint64_t, перечисление zbc_reporting_options ro, зоны struct zbc_zone **, беззнаковые 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 ответ
Есть три метода, которые помогут вам:
- Pointer # slice - вернет новый указатель, перемещенный по смещению.
- Struct # size - возвращает размер структуры в байтах.
- Struct # useMemory - отображает память на структурированные поля.
Таким образом, вы должны создать структуру, запомнить ее размер и для каждого среза i в n размер i* из исходного указателя и использовать память нового указателя в созданной структуре.