【问题标题】:Using JNA to pass a struct containing an array of doubles from Java to C使用 JNA 将包含双精度数组的结构从 Java 传递到 C
【发布时间】:2012-05-30 19:12:51
【问题描述】:

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

【问题讨论】:

    标签: arrays struct jna primitive


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      • 2019-12-06
      相关资源
      最近更新 更多