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で設定する正しい方法は何ですか?