2011-03-15 160 views
4

我试图通过SctpDrv库创建JNA实现。我的问题是,我不明白指向结构数组的指针。我试图寻找解决方案,但它们与我需要知道的一直稍有不同。 JNA dokumentation只显示一个带有指向原始类型数组的指针的例子。似乎也有不同的做法,其中一些被剥夺。作为JNA方法参数指向结构数组的指针

int WSAAPI internal_sctp_getpaddrs (SOCKET, sctp_assoc_t, struct sockaddr **); 
void WSAAPI internal_sctp_freepaddrs (struct sockaddr *); 

根据文档getpaddrs的第三个参数用于返回sockaddr结构的阵列。声明相应的JNA方法的建议方法是什么,以及我如何准备参数以及在我的java代码中调用之后访问它?

此外,为了帮助我理解,我将如何声明和使用函数,而参数是包含指针的数组?

+0

请问http://jna.java.net/#structures有点帮助吗? – 2011-03-15 16:57:14

回答

5
// Declare the SOCKADDR struct 
public class SOCKADDR extends Structure 
{ 
    // Declare fields here 

    public SOCKADDR() 
    { 
     // required for toArray() 
    } 

    public SOCKADDR(Pointer pointer) 
    { 
     super(pointer); 
    } 
} 

// Declare these Java methods to be mapped by JNA to the C APIs 
public int internal_sctp_getpaddrs(int socket, int sctp, PointerByReference sockaddrRef); 
public void internal_sctp_freepaddrs(SOCKADDR sockaddr); 

// Use this code to call internal_sctp_getpaddrs() 
// This code assumes the number of SOCKADDRs returned is in the int return value. 
{ 
    PointerByReference sockaddrRef; 
    Pointer pointer; 
    SOCKADDR sockaddr, sockaddrs[]; 
    int size; 

    sockaddrRef = new PointerByReference(); 
    size  = internal_sctp_getpaddrs(socket, sctp, sockaddrRef); 
    pointer  = sockaddrRef.getValue(); 
    sockaddr = new SOCKADDR(pointer); 
    sockaddrs = (SOCKADDR[]) sockaddr.toArray(size); 
}