【问题标题】:JNA mapping LPCSTR on windows platformJNA在windows平台上映射LPCSTR
【发布时间】:2023-03-18 03:47:01
【问题描述】:
我正在使用 JNA 为 C/C++ 调用一个 DLL api。
DLL 中的函数 API 是短 DKT_init(LPCSTR 名称)。我将相应的 java 方法设为 public short DKT_init(String name);但是当我调用它时,DLL API 返回一个参数错误。我想知道如何在 JNA 中映射 LPCSTR?由于 LPCSTR 是 cons char * 但 String 是 char *。
【问题讨论】:
标签:
java
mapping
jna
lpcstr
【解决方案1】:
字符串是 LPCSTR 的适当映射。 JNA 将使用默认平台编码将修改后的 UTF16 字符转换为以 NUL 结尾的字节缓冲区。
您可以尝试传入一个显式字节数组(使用上面建议的替代方法映射),这将消除潜在的不正确编码问题,例如
byte[] arg = { (byte)'f', (byte)'o', (byte)'o', (byte)0 };
您可以通过设置系统属性“jna.encoding”来更改使用的编码。
您还应该消除“LPCSTR”实际上是错误类型的可能性;如果函数需要一个可以写入的缓冲区,则 String 将不起作用,如果它实际上是 LPTCSTR 并且您使用的是 UNICODE,那么您需要传递一个 WString 来代替。
【解决方案2】:
您是否尝试过将其映射到字节数组,如下所示:
short DKT_INIT(byte [] nameAsByteArray);
//now you should be able to obtain it like this:
System.out.println(new String(nameAsByteArray).trim());