我正在尝试使用 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 端分配固定长度的字符缓冲区...
理想情况下,我只想通过 JNA 打一个电话,并坚持使用托管内存。有什么建议么?最好按照该链接上描述的方式进行,还是有其他方法可以做到这一点?