我正在尝试构建一些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
请发布例外。 –