7

次のような単一のエクスポートされたメソッドを持つ C++ DLL があるとします。

CustomerProcessor* getInstance();

つまり、呼び出す必要のあるメソッドを実際に含むクラスのインスタンスを返すだけです。

JNA (com.sun.jna.Library を拡張) を使用して getInstance() メソッドを Java のクラスにマップし、返された CustomerProcessor インスタンスを com.sun.jna.Pointer に格納できることはわかっています。

次に、これをどうにかして CustomerProcessor クラスにマップして、その上でメソッドを呼び出すことができますか (そうであれば、その方法)?

4

2 に答える 2

3

任意type* function()の定義では、JNA を使用して を返すメソッドをマップできますがcom.sun.jna.Pointer、JNA から C++ オブジェクトのメソッドを呼び出すことはできません。

これに対する簡単な回避策は、オブジェクトのメソッドを呼び出すだけの C インターフェイス ライブラリを作成することです。そのため、メンバー関数があるfoo()場合は、C++ コードから C メソッドをエクスポートできます。

extern "C" void bar(type* var){
   var->foo();
}

明らかに、これにより作業が追加されます...しかし、 JNIに切り替えるためのオーバーヘッドはほぼ同じになると思います。

于 2009-12-10T14:06:29.863 に答える
1

JNAeratorは、あなたが求めることを容易にするかもしれません。デマングリングとvtableアクセスをある程度サポートしています(* thisメソッドを呼び出すために必要です)。

于 2011-12-14T18:31:29.313 に答える