2013-12-18 28 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终止的字符串。