2010-11-17 68 views
1

我正在为JNA调用一个用于C/C++的DLL API。 DLL中的函数API是短DKT_init(LPCSTR名称)。我将相应的java方法作为public DKT_init(String name);但是当我调用它时,DLL API返回一个参数错误。我想知道如何在JNA中映射LPCSTR?由于LPCSTR是cons char *,但String是char *。JNA在Windows平台上映射LPCSTR

回答

0

您是否尝试过将其映射到一个字节数组,像这样:

short DKT_INIT(byte [] nameAsByteArray); 
//now you should be able to obtain it like this: 
System.out.println(new String(nameAsByteArray).trim()); 
1

字符串是LPCSTR适当的映射。 JNA将使用默认平台编码将修改后的UTF16字符转换为NUL终止的字节缓冲区。

您可以尝试传入一个明确的字节数组(使用上面建议的备用方法映射),这将消除不正确编码问题的可能性,例如,

byte[] arg = { (byte)'f', (byte)'o', (byte)'o', (byte)0 }; 

您可以通过设置系统属性“jna.encoding”来改变编码。

您还应该消除“LPCSTR”实际上是错误类型的可能性;如果函数需要一个可以写入的缓冲区,则String将不起作用,如果它实际上是LPTCSTR并且正在使用UNICODE,则需要传递一个WString。