我有一个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函数的正确方法是什么?
答案 0 :(得分:1)
您的结构不包含基本数组。它包含一个指向double的指针,该指针被赋予双精度数组的地址。
您的vals
字段必须是指针类型(名义上为Pointer
)。然后,您可以使用您选择的NIO缓冲区或com.sun.jna.Memory
为双精度数组分配空间。