【问题标题】:Using TCHAR buffer with JNA将 TCHAR 缓冲区与 JNA 一起使用
【发布时间】: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如何传递数组

标签: java c++ jna


【解决方案1】:

您的缓冲区需要是可写的。 StringWString 是只读的。

char[] 用于本机wchar_t[],将byte[] 用于本机char[];然后,您可以使用Native.toString() 提取本机以 NUL 结尾的字符串。

【讨论】:

    猜你喜欢
    • 2017-01-16
    • 1970-01-01
    • 2011-04-03
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    相关资源
    最近更新 更多