如何在使用JNA的本机方法返回的结构中映射可变长度数组

时间:2016-03-31 19:59:58

标签: java jna jnaerator

我有一个包含其他结构指针数组的结构,以及一个数组长度的字段。此结构通过本机方法通过“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生成的相应Java类:

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错误消息,指出“必须初始化数组字段”。

目前我使用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处理这个问题的规范方法是什么?

1 个答案:

答案 0 :(得分:1)

假设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;
}