[英]JNA return array of struct as parameter
我有一个 C function,它创建了一个结构数组
int createArray(myStruct** data_array);
从 C 我这样称呼 function :
myStruct* data_array;
int size = createArray(&data_array);
我想以与 JNA 类似的方式调用createArray
。 我已经使用 JNAerator 生成了包装器。
int createArray(myStruct.ByReference[] data_array);
我不知道将什么传递给 JNA 方法createArray
,因为data_array
实际上是一个 output 参数。 我实际上认为生成的 JNA 方法是错误的,因为我不想传递myStruct
的数组,我想接收一个。
JNA 方法的参数不应该是PointerByReference
吗?
以下是一些对我不起作用的尝试
PointerByReference ptr = new PointerByReference();
int size = api.createArray(ptr); //Invalid memory access
myStruct.ByReference[] array = new myStruct.ByReference[10];
Arrays.fill(stLinks, new myStruct.ByReference()); //without this I get NullpointerException
int size = api.createArray(array); //Invalid memory access
JNA 方法的参数不应该是
PointerByReference
吗?
那么它可能是。 应该是? 取决于您是否需要类型安全。
这里重要的一点是,原生 arrays 是 memory 的连续块,因此固定大小结构的数组只是一个指针,其中包含数组中每个元素的偏移量。
如果您将数组作为参数传递,它将接收指向第一个元素 ( myStruct[0]
) 的指针并自动写入本机 memory 来填充它。
或者,您可以传递一个PointerByReference
并从中实例化一个数组。 一个低级接口,您可以更直接地控制 memory 何时被读取和写入。
这里最重要的是要知道是谁在为阵列分配 memory,并确保它已被释放。 rest 主要取决于编码风格、可读性和类型安全性。
似乎无效 memory 访问的问题是由其他副作用引起的。 我必须先从 API 调用其他函数,然后才能使用 createArray。
现在的工作代码是:
PointerByReference ptr = new PointerByReference();
int size = api.createArray(ptr);
Pointer ptrToFirst = ptr.getValue();
myStruct firstElement = new myStruct(ptrToFirst);
myStruct[] array = (myStruct []) firstElement.toArray(size);
//Work with Array
api.deleteArray();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.