如何使用 JNA 映射从本机方法返回的结构化长度数组
How to map variable length arrays in a structured returned from a native method using JNA
我有一个包含其他结构指针数组的结构,以及一个数组长度字段。此结构由本机方法通过 "out" 参数返回。
原"C"结构:
typedef struct MMAL_COMPONENT_T
{
uint32_t input_num; /**< Number of input ports */
MMAL_PORT_T **input; /**< Array of input ports */
} MMAL_COMPONENT_T;
JNAerator生成的对应Javaclass:
public class MMAL_COMPONENT_T extends Structure {
public int input_num;
public MMAL_PORT_T.ByReference[] input;
}
"C"方法签名:
MMAL_STATUS_T mmal_component_create(const char *name, MMAL_COMPONENT_T **component);
Java 用法:
PointerByReference ref = new PointerByReference();
status = mmal.mmal_component_create("<component-name>", ref);
MMAL_COMPONENT_T component = new MMAL_COMPONENT_T(ref.getValue());
这会生成一条 JNA 错误消息,指出 "Array fields must be initialized"。
目前我正在使用 Pointer
代替数组并从中手动构建数组:
public class MMAL_COMPONENT_T extends Structure {
public int input_num;
public Pointer input;
}
使用情况:
Pointer[] array = component.input.getPointerArray(0, component.input_num);
MMAL_PORT_T port = new MMAL_PORT_T(array[0]);
port.read();
但是这种方法似乎并不令人满意,因为它冗长而且因为使用了指针而不是实际的结构类型。
那么用 JNA 处理这个问题的规范方法是什么?
假设input
指向一个指针数组,将Pointer
操作封装在一个成员函数中,例如
public MMAL_PORT_T[] getPorts() {
Pointer[] array = input.getPointerArray(0, input_num);
MMAL_PORT_T[] ports = new MMAL_PORT_T[array.length];
for (int i=0;i < ports.length;i++) {
ports[i] = new MMAL_PORT_T(array[i]);
}
return ports;
}
我有一个包含其他结构指针数组的结构,以及一个数组长度字段。此结构由本机方法通过 "out" 参数返回。
原"C"结构:
typedef struct MMAL_COMPONENT_T
{
uint32_t input_num; /**< Number of input ports */
MMAL_PORT_T **input; /**< Array of input ports */
} MMAL_COMPONENT_T;
JNAerator生成的对应Javaclass:
public class MMAL_COMPONENT_T extends Structure {
public int input_num;
public MMAL_PORT_T.ByReference[] input;
}
"C"方法签名:
MMAL_STATUS_T mmal_component_create(const char *name, MMAL_COMPONENT_T **component);
Java 用法:
PointerByReference ref = new PointerByReference();
status = mmal.mmal_component_create("<component-name>", ref);
MMAL_COMPONENT_T component = new MMAL_COMPONENT_T(ref.getValue());
这会生成一条 JNA 错误消息,指出 "Array fields must be initialized"。
目前我正在使用 Pointer
代替数组并从中手动构建数组:
public class MMAL_COMPONENT_T extends Structure {
public int input_num;
public Pointer input;
}
使用情况:
Pointer[] array = component.input.getPointerArray(0, component.input_num);
MMAL_PORT_T port = new MMAL_PORT_T(array[0]);
port.read();
但是这种方法似乎并不令人满意,因为它冗长而且因为使用了指针而不是实际的结构类型。
那么用 JNA 处理这个问题的规范方法是什么?
假设input
指向一个指针数组,将Pointer
操作封装在一个成员函数中,例如
public MMAL_PORT_T[] getPorts() {
Pointer[] array = input.getPointerArray(0, input_num);
MMAL_PORT_T[] ports = new MMAL_PORT_T[array.length];
for (int i=0;i < ports.length;i++) {
ports[i] = new MMAL_PORT_T(array[i]);
}
return ports;
}