使用JNA将包含从Java到C的双精度数组的结构传递给C

时间:2012-05-30 19:12:51

标签: arrays struct jna primitive

我有一个C函数,它需要一个包含双精度数组的结构:

typedef struct ArrayHolder {
    int numVals;
    double* vals;
} ArrayHolder;

void putArrayHolder(ArrayHolder* holder);

我试图用Java来处理这个问题

public interface CLibrary extends Library {
    public static class ArrayHolder extends Structure {
        public static class ByValue extends ArrayHolder implements Structure.ByValue {}
        public static class ByReference extends ArrayHolder implements Structure.ByReference {}

        public int numVals;
        public double[] vals;
    }

    void putArrayHolder(ArrayHolder.ByReference holder);
}

...

CLibrary.ArrayHolder.ByReference holderRef = new CLibrary.ArrayHolder.ByReference();
holderRef.numVals = 3;
holderRef.vals = new double[3];
holderRef[0] = 1;
holderRef[1] = 2;
holderRef[2] = 3;
clib.putArrayHolder(holderRef);

不幸的是,上面的Java代码导致C函数接收到损坏的数据 - “numVals”值似乎正常,但“vals”数组已损坏。

我在这里缺少什么?在Java中设置这种结构(包含原始数组)以便通过JNA将其传递给C函数的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您的结构不包含基本数组。它包含一个指向double的指针,该指针被赋予双精度数组的地址。

您的vals字段必须是指针类型(名义上为Pointer)。然后,您可以使用您选择的NIO缓冲区或com.sun.jna.Memory为双精度数组分配空间。