2012-03-29 250 views
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有關。我應該如何轉換它並在回調中用作數組?

+0

從我所瞭解的情況來看,這個例外清楚地表明'StdCallCallback'接口不能被聲明爲結構中的字段。您必須像其他回調一樣從「StdCallCallback」或「Callback」接口派生/擴展回調字段。 http://permalink.gmane.org/gmane.comp.java.jna.user/4130 – ecle 2012-03-29 12:35:48

+0

其他StdCallCallback字段有效!幸運的是,我解決了這個問題。我用'Pointer arg2'而不是'int [] arg2'。 – ilya 2012-03-30 02:54:34

+0

錯誤消息有誤導性;嘗試將本機類型映射到回調簽名時可能發生失敗(原始數組不允許作爲回調參數,而不提供自定義回調參數轉換)。 – technomage 2012-04-02 18:11:26

回答

1

成功;其他StdCallCallback領域工作!

幸運的是,我解決了這個問題。我用Pointer arg2而不是int[] arg2