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

时间:2014-05-28 18:39:22

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

1 个答案:

答案 0 :(得分:1)

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

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