当前位置: 首页 > 知识库问答 >
问题:

在JNA中使用TCHAR缓冲区

贾成天
2023-03-14

我试图构建一些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);
boolean CsilInit();
boolean CsilUnInit();
boolean CsilConnect(WString server, WString service);
boolean CsilRead();
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

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个答案

李泓
2023-03-14

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

使用char[]作为本机wchar_t[]byte[]作为本机char[];然后可以使用native.tostring()提取以NUL结尾的本机字符串

 类似资料:
  • 问题内容: 在编写用于OpenGL库的Matrix类时,我遇到了一个问题,即使用Java数组还是使用Buffer策略存储数据(JOGL为Matrix操作提供直接缓冲区复制)。为了对此进行分析,我编写了一个小型性能测试程序,该程序比较了Arrays vs Buffers和Direct Buffers上循环和批量操作的相对速度。 我想在这里与您分享我的结果(因为我发现它们很有趣)。请随时发表评论和/或

  • 我有一个简单的客户端和服务器设置。客户端希望在服务器中使用ZeroMQ执行通信方法。我将使用REQ和REP套接字,因为它们适合这个用例。然而,我对protobuf的定义有疑问。我认为这两个选项可用于实现目标: 其中“control”包含要远程执行的方法的名称。另一种选择可以是: 最好的方法是什么?或者至少使用一种方法而不是另一种方法的权衡是什么?

  • 我试图在Windows上的Qt中使用google协议缓冲区。因此,我使用MingGW的msys从github编译了protobuf源代码。proto编译器(protoc)似乎工作得很好,但遗憾的是,它无法使用生成的。博士和。pb。从Qt环境中抄送文件。 将此添加到我的。pro文件: 但我仍然得到“未定义的引用…”当我试图编译这个类时,它使用了所有的方法。 代码必须正确,因为它在使用protoc和Q

  • 正在为以下内容编写javadoc: 但是,将缓冲的输入流传入真的是一个问题吗?因此: 是否将is缓冲到bis中,或者java是否检测到is已缓冲并设置bis=is?如果是,不同的缓冲区大小是否会有所不同?如果没有,为什么不呢<注意:我说的是输入流,但实际上这个问题也适用于输出流

  • 我正在使用JOGL,但这个问题一般适用于OpenGL。似乎存在类似的问题,但它们要么针对GLSL代码,要么与复制帧缓冲区的内容有关,要么是一般建议-使用帧缓冲区对象,而不是。 我正在做一些阴影映射。如何使用帧缓冲对象将深度通道直接渲染到纹理? 能否请你贴一段初始化纹理和帧缓冲对象的代码,以及渲染场景前初始化一切的代码? 目前,我使用<code>glCopyTexSubImage2D<code>。我

  • 问题内容: 我正在用Go编写一个简单的Web应用程序,并且希望将响应流传输到客户端(即,在请求得到完全处理后,不要缓冲并以块的形式发送): 从客户端的角度来看,这两行将同时发送。任何建议表示赞赏:) @dystroy答案后编辑 我个人进行的每次写完后都可以刷新,但是在我的用例中,这还不够: 我也希望刷新我的输出。无论如何“自动刷新” ResponseWritter? 解 我在golang的邮件列表