2013-12-18 29 views
2

我正在嘗試構建一些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 [],結果相同。

+1

'boolean CsilGetData(WString server,int len);' –

+0

這沒有奏效,我仍然遇到內存訪問錯誤。如果它在字符串中,我也不確定本機代碼是否可以修改傳遞給它的數據? – user3116195

+0

請發佈例外。 –

回答

0

您的緩衝區需要可寫。 StringWString是隻讀的。

原生wchar_t[]byte[]對本地char[]使用char[];然後您可以使用Native.toString()來提取原生NUL終止的字符串。