1

関数呼び出しがあります:

long foo(mystruct **list)

の定義mystruct

typedef struct {
    otherstruct *bar[64];
} mystruct;

バーに対応する(JNA)Structure[]を取得しようとしています。私の現在の関数定義はint foo(PointerByReference list);、それがポインターへのポインターであるためですが、Structure[] を取得する方法がわかりません。

C では、コードは次のように使用されます。

mystruct *list;
foo(&list);
for (i=0; i<64; i++)
    doStuff(list->bar[i]);
4

1 に答える 1

2
  1. PointerByReference適切です。getValue()値を取得するために使用しPointer ます。
  2. その値で、「mystruct」構造を初期化します
  3. " otherstruct *bar[64]" は の配列を表すためstruct*、 type のフィールドを明示的に使用して、Structure.ByReference[]JNA が配列をインライン構造体ではなくポインターとして扱うようにする必要があります。

コード:

class OtherStruct extends Structure {
    class ByReference extends OtherStruct implements Structure.ByReference { }
    ...
}
class MyStructure extends Structure {
    public OtherStruct.ByReference[] bar = new OtherStruct.ByReference[64];
}

JNA は、ネイティブ関数呼び出しの前後で必要な場所で Structure.read() および Structure.write() を暗黙的に呼び出す必要がありますが、それ以外では、使用状況に応じてこれらの呼び出しを明示的に行う必要がある場合があります。

于 2012-03-13T18:50:34.530 に答える