Указатель на массив структур в качестве аргументов метода JNA - PullRequest
4 голосов
/ 15 марта 2011

Я пытаюсь создать реализацию JNA над библиотекой SctpDrv .Моя проблема в том, что я не берусь за указатели на структуры массивов.Я пытался найти решение, но они всегда немного отличались от того, что мне нужно знать.Документация JNA показывает только пример с указателем на массив примитивного типа.Кажется также, что существуют разные способы сделать это, некоторые из них ограничены.

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

Согласно документации, третий аргумент getpaddrs используется для возврата массива sockaddr структур.Каков рекомендуемый способ объявить соответствующие методы JNA и как мне подготовить аргумент, а также получить доступ к нему после вызова в моем коде Java?

Кроме того, чтобы помочь мне понять, как быЯ объявляю и использую функцию, где вместо аргумента используется массив, содержащий указатели?

1 Ответ

5 голосов
/ 05 августа 2011
// 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);
}
...