2014-01-19 95 views
1

有没有一种方法让jnr为我构建一个结构体,以便使用jnr访问返回的调用。如何使用java jnr来推断clib结构

例如,如果我想用

int statvfs(const char *path, struct statvfs *buf); 

其中结构statvfs是:

struct statvfs { 
    unsigned long f_bsize; /* file system block size */ 
    unsigned long f_frsize; /* fragment size */ 
    fsblkcnt_t  f_blocks; /* size of fs in f_frsize units */ 
    fsblkcnt_t  f_bfree; /* # free blocks */ 
    fsblkcnt_t  f_bavail; /* # free blocks for unprivileged users */ 
    fsfilcnt_t  f_files; /* # inodes */ 
    fsfilcnt_t  f_ffree; /* # free inodes */ 
    fsfilcnt_t  f_favail; /* # free inodes for unprivileged users */ 
    unsigned long f_fsid;  /* file system ID */ 
    unsigned long f_flag;  /* mount flags */ 
    unsigned long f_namemax; /* maximum filename length */ 
}; 

我如何将能够访问此?

回答

1

要使用C++结构,您应该定义延伸jnr.ffi.Struct的类。每个字段应该有一个java类型,在jnr.ffi.Struct类中定义或者从其中的一个扩展。

例如来自* .h文件的short字段应该在结构类中定义为jnr.ffi.Struct.Signed16

如果你需要有一个数组字段,你必须使用静态方法Struct.array(Struct.Signed8[] array)如下初始化:

public final Signed8[] byteArray = array(new Signed8[8]) 
+0

如何指点一下? – zcaudate

+0

你是指指针作为结构的字段或想知道'指针“类的用法? – goto1134