我试图使用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拨打一个电话,并坚持使用托管内存。有什么建议?最好是按照该链接中描述的方式进行,还是有其他方法可以做到这一点?
答案 0 :(得分:1)
您的本机结构包含一个字节数组,可能会或可能不会NUL
- 终止。这应该由Java中的byte[]
表示,并使用Native.toString(byte[])
将其转换为String
。
当本机类型为String
时,您应该只使用[const ]char *
。