【问题标题】:JNA receive a struct containing a string from C/C++JNA 从 C/C++ 接收包含字符串的结构
【发布时间】:2014-05-28 18:39:22
【问题描述】:

我正在尝试使用 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 拨打一个电话,并坚持使用托管内存。有什么建议么?最好还是按照该链接上描述的方式进行,还是有其他方法可以做到这一点?

【问题讨论】:

    标签: java c++ struct jna character-arrays


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 2014-11-10
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 2013-07-12
      • 2014-04-17
      相关资源
      最近更新 更多