Давайте рассмотрим, что нам нужно передать структурированную форму обратных вызовов нативному коду 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
в методе.Как я должен преобразовать это и использовать в качестве массива в обратном вызове?