2012-11-22 33 views
6

我想調用一個dll文件中的C++函數,C++函數將結構對象作爲參數引用,並且函數將分配該函數中的值,JNA:結構類中的getFieldOrder()的目的

所以在我的Java應用程序,以結構對象傳遞給函數我沒這樣寫:

interface someinterface extends Library{ 
public static class strctclass extends Structure 
{ 
    public static class ByReference extends tTIDFUDeviceInfo implements Structure.ByReference {} 
    public short xxx=0; 
    public char yyy='0'; 
    public boolean zzz=false 
    public String www=new String(); 
    protected ArrayList getFieldOrder() { 
     // TODO Auto-generated method stub 
     ArrayList fields = new ArrayList(); 
    fields.add(Arrays.asList(new short{xxx})); 
    fields.add(Arrays.asList(new char{yyy})); 
    fields.add(Arrays.asList(new boolean{zzz})); 
    fields.add(Arrays.asList(new String{www})); 
    return fields; 
} 
someinterface instance=(someinterface) Native.loadLibrary("mydll", someinterface.class); 
int somefunction(strctclass.ByReference strobject); 
} 

我的主類

public class Someclass 
{ 
public static void main(String args[]) 
{ 
someinterface.strctclass.ByReference sss=new someinterface.strctclass.ByReference(); 
someinterface obj=someinterface.instance; 
obj.somefunction(sss); 
} 
} 

時,我想這是給我

java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.lang.Comparable 

那麼我該怎麼辦?在getFieldOrder()函數中有什麼問題嗎?

任何人都可以解釋我究竟如何將Java中的類對象轉換爲C++中的結構對象?

實際上在調用函數時發生異常,但我不明白爲什麼它發生這種情況。

回答

1

From the JavaDoc:

返回其正確的順序

但是這種結構的字段名,你要迅速對你正在嘗試將JNA Structure映射到一個事實跑起來C++類,它根本無法工作。 JNA不提供JNA和C++類之間的任何自動翻譯。

編輯

要明確:

protected List<String> getFieldOrder() { 
    return Arrays.asList(new String[] { "xxx", "yyy", "zzz", "www" }); 
} 
+0

這就是我知道C++的結構在Java中使用JNA代表和發送結構對象作爲函數參數的唯一途徑,所以是什麼解決這個異常?我在我的代碼中使用的唯一arraylist是在** getfieldoreder()**函數,所以認爲功能實現是問題,並要求澄清 –

+0

我試過了,但它給我編譯時錯誤說Type不匹配:不能從short轉換爲String ... as my xxx變量i s的類型短,但我們將其分配給字符串array.so我分別分配每個變量,如後在代碼中所示。所以它不能解決我的問題。 –

+0

請閱讀上述答案的附錄。 – technomage