我正在使用 JNA 从 Java 调用 C 库。
在我的 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”作为函数的输出,虽然好处是它不会崩溃,但它也没有给出正确的行为。
想法?