我正在嘗試構建一些Java代碼,以便在用VC++編寫的DLL中調用某些網絡功能。導出的功能包括(從.h文件)與JNA一起使用TCHAR緩衝區
EX CS BL BOOL CD CsilInit(void);
EX CS BL BOOL CD CsilUnInit(void);
EX CS BL BOOL CD CsilConnect(TCHAR * server, TCHAR * service);
EX CS BL BOOL CD CsilRead(void);
EX CS BL BOOL CD CsilGetData(TCHAR buffer[], int bufflen);
其中我制訂如下第4:
boolean CsilInit();
boolean CsilUnInit();
boolean CsilConnect(WString server, WString service);
boolean CsilRead();
所有這些似乎工作確定。當我嘗試爲CsilGetData映射參數時,我的問題就出現了 - 代碼大概需要一個指向第二個參數中定義大小的Unicode字符數組的指針,但至今我一直無法提供正確的Java映射。當調用時,緩衝區將由本機代碼加載數據,然後當函數返回時,數據將被調用Java代碼讀取。
任何人都可以提供一個正確的方法來做到這一點的例子嗎?
至於建議,我已經試過作爲測試映射CsilGetData作爲
boolean CsilGetData(WString buffer, int bufflen)
,然後調用它,如下所示
WString buffer = new WString(" ");
...
while (CSIL.INSTANCE.CsilGetData(buffer, buffer.length())) {
System.out.print(buffer.toString());
}
但在執行調用CsilGetData給
Exception in thread "main" java.lang.Error: Invalid memory access at com.sun.jna.Native.invokeInt(Native Method) at com.sun.jna.Function.invoke(Function.java:371) at com.sun.jna.Function.invoke(Function.java:315) at com.sun.jna.Library$Handler.invoke(Library.java:212) at com.sun.proxy.$Proxy0.CsilGetData(Unknown Source) at qeitest.Main.main(Main.java:66)
Technomage建議使用char []來代替,所以我修改了代碼以將映射定義爲
boolean CsilGetData(char[] buffer, int bufflen)
,然後調用它作爲
public static final int cnstBufLen = 2048;
char[] buffer = new char[cnstBufLen];
...
while (CSIL.INSTANCE.CsilGetData(buffer, cnstBufLen)) {
System.out.print(buffer.toString());
}
,但我仍然會得到相同的存儲器存取例外。我相信這是正確的映射,但我也試過byte [],結果相同。
'boolean CsilGetData(WString server,int len);' –
這沒有奏效,我仍然遇到內存訪問錯誤。如果它在字符串中,我也不確定本機代碼是否可以修改傳遞給它的數據? – user3116195
請發佈例外。 –