1
讓我們考慮一下,我們需要將回調的結構化形式傳遞給本機代碼DLL。 回調中的一個具有在C表示法如下形式:如何使用JNA StdCallCallback接受結構內的int數組?
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,
當我嘗試初始化本地DLL與TRCallbackCollection結構的實例:
lib.InitKernel(callbacks,5);
其他回調工作正常。我認爲這個問題與方法中的int[] arg2
有關。我應該如何轉換它並在回調中用作數組?
從我所瞭解的情況來看,這個例外清楚地表明'StdCallCallback'接口不能被聲明爲結構中的字段。您必須像其他回調一樣從「StdCallCallback」或「Callback」接口派生/擴展回調字段。 http://permalink.gmane.org/gmane.comp.java.jna.user/4130 – ecle 2012-03-29 12:35:48
其他StdCallCallback字段有效!幸運的是,我解決了這個問題。我用'Pointer arg2'而不是'int [] arg2'。 – ilya 2012-03-30 02:54:34
錯誤消息有誤導性;嘗試將本機類型映射到回調簽名時可能發生失敗(原始數組不允許作爲回調參數,而不提供自定義回調參數轉換)。 – technomage 2012-04-02 18:11:26