0

double の配列を含む構造体を期待する 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" 配列が破損していました。

ここで何が欠けていますか?JNAを介してC関数に渡すために、この種の構造(プリミティブ配列を含む)をJavaで設定する正しい方法は何ですか?

4

1 に答える 1

1

構造体にプリミティブ配列が含まれていません。これには、doubleへのポインタが含まれています。doubleへのポインタには、doubleの配列のアドレスが割り当てられています。

フィールドvalsはポインタ型である必要があります(名目上Pointer)。次に、選択したNIOバッファーを使用するかcom.sun.jna.Memory、doubleの配列にスペースを割り当てることができます。

于 2012-05-31T13:52:03.023 に答える