3

使用 JNA,我正在加载一个用 C++ 编写的 dll 并调用该 C++ 函数中存在的函数:

 int xxfunction(Char* ptr){...}

在这里,我需要发送一个 char 数组,以便该函数为其赋值。基本上我需要通过引用传递 char 数组。

根据 JNA 文档,char*Java 中的 C++ 等效项是String,所以我创建了一个 String 对象并将其传递给函数,如下所示:

Java函数声明:

interface foo extends Library
{
 ....//loading dll and other work
  int xxfunction(String chararray);//function declaration
}

Java函数调用:

public static void main(String args[]) 
{
 String str="abcd";
 int i=fooinstance.xxfunction(str);//function call
}

但是当我执行这段代码时,它给了我:

Java 运行时环境检测到致命错误:无法写入核心转储。默认情况下,在 Windows 的客户端版本上不启用小型转储

崩溃发生在 Java 虚拟机之外的本地代码中。请参阅有问题的框架以了解报告错误的位置。

那么在函数需要 char 指针的情况下,将 String 作为参数传递是正确的方法吗?java中的C++ char等价物是字节,所以我需要将字节数组作为参数传递吗?

我什至不能将指针对象从 JNA 传递给函数,因为它给了我IllegalargumentException.

4

1 回答 1

4

const char*应该映射到 Java String。如果有任何可能不是const则应改为传递缓冲区(byte[]Memory或 NIO 缓冲区),然后Native.toString()在“返回”值上使用。

作为风格问题,您应该始终向被调用者提供所提供缓冲区的长度,以便它有足够的可用信息来避免覆盖缓冲区。

于 2012-12-06T18:10:49.307 回答