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