Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNR-FFI如何从一个指针到另一个指针读取结构数组_Java_C_Struct_Ffi_Jnr - Fatal编程技术网

Java JNR-FFI如何从一个指针到另一个指针读取结构数组

Java JNR-FFI如何从一个指针到另一个指针读取结构数组,java,c,struct,ffi,jnr,Java,C,Struct,Ffi,Jnr,我正在尝试使用与C库接口 有一个函数: 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()

我正在尝试使用与C库接口

有一个函数:

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();
}
public int zbc_list_zones(@In Pointer dev,@In long sector,
    @In zbc_reporting_options options,@Out PointerByReference zones,
    @Out IntByReference nr_zones);
int zbc_列表_区域(结构zbc_设备*开发,uint64_t扇区,枚举 zbc_报告选项ro,结构zbc_区域**区域,无符号整数* nr_区)

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

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

我尝试了以下方法来读取第一个元素,但它不起作用(结果为零):

zbc_区域结构:

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();
}
public int zbc_list_zones(@In Pointer dev,@In long sector,
    @In zbc_reporting_options options,@Out PointerByReference zones,
    @Out IntByReference nr_zones);
JNR接口:

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();
}
public int zbc_list_zones(@In Pointer dev,@In long sector,
    @In zbc_reporting_options options,@Out PointerByReference zones,
    @Out IntByReference nr_zones);

有三种方法可以帮助您:

  • 指针#切片-将返回按偏移量移动的新指针
  • Struct#size-返回结构的大小(以字节为单位)
  • 结构#使用内存-将内存映射到结构字段
  • 所以,您应该创建一个结构,记住它的大小,对于原始指针中的每个i in n片i*大小,并在创建的结构中使用新指针的内存