繁体   English   中英

JNA返回结构数组作为参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM