让我们考虑一下,我们需要将结构化形式的回调传递给本机代码dll。 其中一个回调在C表示法中具有以下形式:
int myfunc (int arg1,int* arg2,int arg3,int arg4);//it is marked as stdcall in real app
这里arg2是一个int数组。 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,不是 在结构中支持,
当我尝试使用TRCallbackCollection结构的实例初始化本机dll时:
lib.InitKernel(callbacks,5);
其他回调工作正常。我认为问题与方法中的int[] arg2
有关。我应该如何转换它并在回调中用作数组?
答案 0 :(得分:1)
成功;其他StdCallCallback字段有效!
幸运的是,我已经解决了这个问题。我使用Pointer arg2
代替int[] arg2
。