Как я могу использовать JNA StdCallCallback, который принимает массив int внутри структуры? - PullRequest
1 голос
/ 29 марта 2012

Давайте рассмотрим, что нам нужно передать структурированную форму обратных вызовов нативному коду dll.Один из обратных вызовов имеет следующую форму в нотации C:

int myfunc (int arg1,int* arg2,int arg3,int arg4);//it is marked as stdcall in real app

Здесь arg2 - массив целых чисел.arg1 определяет количество элементов в arg2.

Вот код Java:

 public class TRCallbackCollection extends Structure{
       public int fieldsCount;    
       public StdCallLibrary.StdCallCallback myfunc;
//...
    }
//...
TRCallbackCollection callbacks= new   TRCallbackCollection();
callbacks.fieldsCount = 7;       
callbacks.myfunc = new StdCallLibrary.StdCallCallback(){
 public int callback (int arg1, int[] arg2,int arg3,int arg4) {            
  return 0;
 }
};

У меня есть следующая ошибка:

java.lang.IllegalArgumentException: поле структуры "myfunc" было объявлено как интерфейс com.sun.jna.win32.StdCallLibrary $ StdCallCallback, который не поддерживается внутри структуры,

, когда я пытаюсь инициировать нативный DLL с экземпляромструктуры TRCallbackCollection:

lib.InitKernel(callbacks,5);

Другие обратные вызовы работают нормально.Я думаю, что проблема связана с int[] arg2 в методе.Как я должен преобразовать это и использовать в качестве массива в обратном вызове?

1 Ответ

1 голос
/ 20 апреля 2012

Успех;другие поля StdCallCallback работали!

К счастью, я решил проблему.Я использовал Pointer arg2 вместо int[] arg2.

...