JNR-FFI, как читать массив структур от указателя к указателю

Я пытаюсь подключиться к библиотеке C libzbc, используя jnr-ffi.

Есть функция:

int zbc_list_zones ( struct zbc_device * dev, сектор uint64_t, enum zbc_reporting_options ro, struct zbc_zone ** zones, unsigned int * nr_zones )

Как я могу прочитать массив структур из параметра 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);

person Sidias-Korrado    schedule 29.10.2017    source источник


Ответы (1)


Вам помогут три метода:

  1. Pointer#slice - вернет новый указатель, сдвинутый на смещение.
  2. Struct#size - возвращает размер структуры в байтах.
  3. Struct#useMemory — сопоставляет память с полями структуры.

Таким образом, вы должны создать структуру, запомнить ее размер и для каждого i в n фрагменте i*size от исходного указателя и использовать память нового указателя в созданной структуре.

person goto1134    schedule 30.10.2017