2011-03-15 7 views
4

SctpDrv 라이브러리를 통해 JNA 구현체를 생성하려고합니다. 내 문제는 구조 배열에 대한 포인터 주위에 머리를 갖지 않는다는 것입니다. 솔루션을 찾으려고 노력했지만 항상 알고있는 것과는 조금 다릅니다. JNA 문서에는 프리미티브 유형의 배열에 대한 포인터가있는 예제 만 표시됩니다. 또한 이것을하는 여러 가지 방법이있는 것 같습니다. 그 중 일부는 부적절합니다.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가 약간 도움이됩니까? –

답변

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); 
} 
관련 문제