Java から C ライブラリを呼び出すために JNA を使用しています。
私のCコードには次のものがあります:
void printStructArray( SomeStruct **someStruct, int arraySize );
これは、構造体へのポインターの配列を想定しています。つまり、メソッドは次のことを行います。
void printStructArray( SomeStruct **someStruct, int arraySize ) {
for( int i = 0; i < arraySize; i++ ) {
cout << "someStruct: " << someStruct[i]->aLong << " " << someStruct[i]->aString << " " << someStruct[i]->aDouble << endl;
}
}
これは単なるおもちゃの例ですが、同じタイプの引数が必要な実際のライブラリと話したいのですが、おもちゃの例を使用する方がここで説明しやすいと思いますか?
私はあらゆる種類のことを試しましたが、(i) JNA でこの関数を宣言する方法 (ii) JNA でこの関数を呼び出す方法がわかりません。
私の最新の(失敗した)試みは次のとおりです。
SomeStruct.byReference[] structs = new SomeStruct.byReference[]{
new SomeStruct.byReference(123,"hey!",1.23),
new SomeStruct.byReference(456,"cool!",1.45),
new SomeStruct.byReference(789,"world!",1.67) };
PointerByReference pointerByReference = new PointerByReference(structs[0].getPointer());
JniTest.instance.printStructArray(pointerByReference, 3);
これにより、SIGSEGV が発生します。
または:
SomeStruct.byReference[] structs = (SomeStruct.byReference[]) new SomeStruct().toArray( new SomeStruct.byReference[]{
new SomeStruct.byReference(123,"hey!",1.23),
new SomeStruct.byReference(456,"cool!",1.45),
new SomeStruct.byReference(789,"world!",1.67) } );
PointerByReference pointerByReference = new PointerByReference(structs[0].getPointer());
JniTest.instance.printStructArray(pointerByReference, 3);
これにより、ArrayStoreException が発生します
これも試しました:
SomeStruct.byReference[] structs = new SomeStruct.byReference[]{
new SomeStruct.byReference(123,"hey!",1.23),
new SomeStruct.byReference(456,"cool!",1.45),
new SomeStruct.byReference(789,"world!",1.67) }; JniTest.instance.printStructArray(structs, 3);
メソッドが次のように宣言されている場合:
void printStructArray(SomeStruct.byReference[] someStructarray, int num);
これにより、関数からの出力として「0」が得られますが、良い点はクラッシュしないことですが、正しい動作も得られません。
考え?