JNA 接收一个包含来自 C/C++ 的字符串的结构

JNA receive a struct containing a string from C/C++

本文关键字:C++ 字符串 结构 包含 一个 JNA      更新时间:2023-10-16

我正在尝试使用 JNA 从包含固定长度字符数组的 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 进行一次调用,并坚持使用托管内存。 有什么建议吗? 最好只按照该链接上描述的方式进行,还是有其他方法可以做到这一点?

本机结构包含一个字节数组,这些字节数组可能会也可能不会NUL终止。 这应该在 Java 中用 byte[] 表示,并使用 Native.toString(byte[]) 将其转换为String

仅当本机类型为 [const ]char * 时,才应使用 String