2014-01-19 7 views
1

jnr을 사용하여 반환 된 호출에 액세스하기 위해 jnr이 구조체를 생성하는 방법이 있습니까? 예를 들어java jnr을 사용하여 clib 구조체를 유추하는 방법

, 내가 구조체에서 statvfs이 어디

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

을 사용하기를 원한다면 :

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으로 확장되는 클래스를 정의해야합니다. 각 필드는 jnr.ffi.Struct 클래스에서 정의되거나 하나에서 확장 된 java 유형 중 하나를 가져야합니다.

예를 들어, short 필드의 * .h 파일은 struct 클래스에 jnr.ffi.Struct.Signed16으로 정의되어야합니다.

당신이 배열 필드를해야하는 경우 다음과 같은 정적 메소드 Struct.array(Struct.Signed8[] array)를 사용하여 초기화해야합니다

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

방법에 대한 포인터를? – zcaudate

+0

포인터를 구조체의 필드로 사용 하시겠습니까? 아니면 포인터 클래스의 사용법을 알고 싶습니까? – goto1134