【发布时间】:2013-12-19 22:55:57
【问题描述】:
我正在尝试构建一些 Java 代码来调用用 VC++ 编写的 DLL 中的一些网络功能。导出的函数包括(来自 .h 文件)
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 的调用会给出
线程“main”java.lang.Error 中的异常:内存访问无效 在 com.sun.jna.Native.invokeInt(本机方法) 在 com.sun.jna.Function.invoke(Function.java:371) 在 com.sun.jna.Function.invoke(Function.java:315) 在 com.sun.jna.Library$Handler.invoke(Library.java:212) 在 com.sun.proxy.$Proxy0.CsilGetData(未知来源) 在 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); -
这不起作用,我仍然遇到内存访问错误。我也不确定本地代码是否可以修改传递给它的数据,如果它在一个字符串中?
-
请发布例外情况。
-
查看here如何传递数组