java - JNA 从 C/C++ 接收一个包含字符串的结构

标签 java c++ struct jna character-arrays

我正在尝试使用 JNA 从包含固定长度 char 数组的 C/C++ 库中获取一些结构。在 C++ 中,因为我没有动态分配任何东西,所以我可以通过复制将结构返回给调用函数……如果我可以使用 Java,我想保留该签名。我对 JNA 和 Java 还很陌生,所以我确定我只是遗漏了一些东西......

C++ 结构的简化版本如下所示:

 typedef struct MyData_
 {
   int id;
   char name[256];
 } MyData;

 ...

 extern "C"
 MyData fnGetData();

JNA类是这样的:

 public static class MyData extends Structure
 {
     public static class ByValue extends MyData implements Structure.ByValue {}
     public int id;
     public String name;

     @Override
     protected List getFieldOrder()
     {
         return Arrays.asList(new String[] { "id", "name", });
     }
 }

 MyData.ByValue fnGetData();

这给出了一个错误。我也试过在类声明中使用 public char[] name = new char[256]; 但这样做不对。

如果我按照 http://www.eshayne.com/jnaex/example12.html 中的示例进行操作我可以让它工作,但他们的解决方案让我在我的 C++ 库中的堆上分配字符数组,然后我需要创建一个第二次调用来释放内存,当我在 Java 中完成它时。我希望我可以将它保存在堆栈中并只返回一个拷贝。

我可以改变一些东西,以便我使用 ByReference 并在 Java 中分配结构并通过参数列表将其发送到 C 代码进行填充,但我不确定如何在 Java 端分配固定长度的 char 缓冲区...

理想情况下,我只想通过 JNA 进行一次调用并坚持使用托管内存。有什么建议么?最好只采用该链接上描述的方式还是有另一种方式来做到这一点?

最佳答案

您的 native 结构包含一个字节数组,它可能以也可能不以 NUL 结尾。这应该在 Java 中用 byte[] 表示,并使用 Native.toString(byte[]) 将其转换为 String

当 native 类型为 [const ]char * 时,您应该只使用 String

关于java - JNA 从 C/C++ 接收一个包含字符串的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23919410/

相关文章:

java - 使用 vertx 进行 JWT 公钥/私钥身份验证中的握手

C++ STL 堆栈问题 : Why does pop() not throw an exception if the stack is empty?

c++ - glOrtho 制作顶 View 的正确参数是什么?

c - K&R 练习 6-2 - 自引用结构

java - 如何使这个线程安全

java - 如何打包jar文件在jar文件中包含类

java - JLabel:手动设置PreferredSize,但在setText之后获取PreferredSize

c++ - 文件 read() 卡在二进制大文件上

c++ - 有和没有结构的指针声明?

c++ - Visual Studio 抛出异常 : write acces violation. q_deck->p_deck 为 0x110112。 C语言