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

Posted

技术标签:

【中文标题】JNR-FFI如何从指针读取结构数组【英文标题】:JNR-FFI how to read array of structs from pointer to pointer 【发布时间】:2017-10-29 10:00:34 【问题描述】:

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

有一个功能:

int zbc_list_zones ( struct zbc_device * dev, uint64_t 扇区, 枚举 zbc_reporting_options ro, struct zbc_zone ** zone, 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);

【问题讨论】:

【参考方案1】:

以下三种方法可以帮助您:

    Pointer#slice - 将返回一个按偏移量移动的新指针。 Struct#size - 返回结构的大小(以字节为单位)。 Struct#useMemory - 将内存映射到结构字段。

所以你应该创建一个结构,记住它的大小,并且对于 n 中的每个 i 从原始指针切片 i*size 并在创建的结构中使用新指针的内存。

【讨论】:

以上是关于JNR-FFI如何从指针读取结构数组的主要内容,如果未能解决你的问题,请参考以下文章

如何从 TwinCat 读取包含结构数组的结构到 C#

如何从 QDataStream 中读取数组

从读取到对象指针数组的文件中获取段错误?

[swmm]调用存储数据的“结构指针数组”

C 语言文件操作 ( 将结构体写出到文件中并读取结构体数据 | 将结构体数组写出到文件中并读取结构体数组数据 )

分段错误而不是显示消息 - 使用 c 中的指针从文件中读取