2011-12-09 11 views
2

我有一個C++函數:JNA直接調用不與論證結構工作[]

struct Result { 
    //... 
}; 
bool doSomething(Result[]); 

如果我用下面的JNA綁定,函數調用正常工作:

public class Result extends Structure { 
    //... 
} 

public interface CPPLibrary extends Library { 
    public static final CPPLibrary INSTANCE = (CPPLibrary)Native.loadLibrary("dllname"); 
    boolean doSomething(Result[]); 
} 

但隨着直接撥打,我打了IllegalArgumentExceptionclass [Lcom.usta.Result;不是支持的參數類型(在com.usta.CPPLibrary類的方法calcPV01中)。對於直接調用映射我JNA代碼:

public class CPPLibrary implements Library { 
    Native.register("dllname"); 
    public static native boolean doSomething(Result[]); 
} 

我可以在com.sun.jna.Function#convertArgument(見)明確處理結構[]com.sun.jna.Native #getConversion(),由直接調用映射使用,不處理結構[]

回答

0

轉換很簡單,只需在結構數組的第一個元素上調用Structure.getPointer()(假設您首先獲得了來自Structure.toArray的數組)。

當你使用直接映射時,你實際上更好;當傳遞非原始類型的非指針類型時,JNI層必須調用回虛擬機來派生適當的本地數據。

隨意在直接映射中提出支持Structure []參數的問題。這應該被支持(JNA文檔注意指針/字符串/ WString/NativeMapped的數組支持而不是)。

0

如果我用不同的方法簽名:

boolean doSomething(Pointer results); 

它的工作。但後來我必須從Result []轉換爲我自己的指針。