0

我有一个 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 函数的正确方法是什么?

4

1 回答 1

1

您的结构不包含原始数组。它包含一个指向 double 的指针,该指针被分配了一个 double 数组的地址。

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

于 2012-05-31T13:52:03.023 回答