让我们考虑一下,我们需要将结构化形式的回调传递给 native 代码 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: Structure field "myfunc" was declared as interface com.sun.jna.win32.StdCallLibrary$StdCallCallback, which is not supported within a Structure,
当我尝试使用 TRCallbackCollection 结构的实例初始化 native dll 时:
lib.InitKernel(callbacks,5);
其他回调工作正常。我认为问题与方法中的 int[] arg2
相关。我应该如何转换它并用作回调中的数组?
最佳答案
成功;其他 StdCallCallback 字段有效!
幸运的是,我已经解决了这个问题。我使用了Pointer arg2
而不是int[] arg2
。
关于java - 如何使用 JNA StdCallCallback 接受结构中的 int 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9922993/