C ++ライブラリに使用されているJNAへの参照をオンラインで(stackoverflowの一部を含む)見つけましたが、JNAドキュメントで見つけることができるものは何もありません。特に、C++ クラスをラップする方法はないようです。
RTAudio を使用するにはネイティブ アクセスが必要ですが、RTAudio の関数はすべて RTAudio クラスのメンバー関数です。確認のために言っておきますが、JNA は適切な方法ではありませんか?
C ++ライブラリに使用されているJNAへの参照をオンラインで(stackoverflowの一部を含む)見つけましたが、JNAドキュメントで見つけることができるものは何もありません。特に、C++ クラスをラップする方法はないようです。
RTAudio を使用するにはネイティブ アクセスが必要ですが、RTAudio の関数はすべて RTAudio クラスのメンバー関数です。確認のために言っておきますが、JNA は適切な方法ではありませんか?
この質問は、 JNAを使用してC ++インスタンスメソッドを呼び出す方法を尋ねることに相当します。それは可能ですが、いくつかの作業を行う必要があります。extern "C"
特に、実際に呼び出す必要のある関数であるラッパーを作成する必要があります。
任意type* function()
の定義について、JNAを使用してメソッドをマップし、を返すcom.sun.jna.Pointer
ようにすることはできますが、JNAからC++オブジェクトのメソッドを呼び出すことはできません。
これに対する簡単な回避策は、オブジェクトのメソッドを呼び出すだけのCインターフェイスライブラリを作成することです...したがって、メンバー関数があるfoo()
場合は、C++コードからCメソッドをエクスポートできます。
extern "C" void bar(type* var){
var->foo();
}
明らかに、これによりいくつかの作業が追加されます...しかし、 JNIに切り替えるためのオーバーヘッドはほぼ同じだと思います。
JNAは、メソッドがDLLにエクスポートされる方法のみを考慮します。これは、C ++装飾なしextern "C"
である必要があります(したがって、 )。したがって、呼び出すメソッドを公開せずに、そのようなメソッド内で必要なことをすべて実行できます。
上記の私の不自然な例では、これはfoo()
、DLL内で定義されている限り、実際には公開する必要がないことを意味します。これはC++関数であるため、JNAは直接呼び出すことはできませんが、JNAが呼び出すことができる関数内から呼び出すことができます。これが、提案したソリューションが機能する理由です。
したがって、はい、すべてのメンバー関数(作成、操作、破棄)への呼び出しを1つの関数に完全にカプセル化でき、JNAは気にしません。
Swigを試してください。それはあなたのためにc++クラスのラッパーを作成します。
JNAはネイティブライブラリにアクセスするためのものです。必要なのは Java - COM Bridge だと思います。この場合、無料の代替手段がいくつかあります。
JCOM http://sourceforge.net/projects/jcom
ジェイコブhttp://sourceforge.net/projects/jacob-project
パスでジェイコブを使用して良い結果を得ましたが、少し時代遅れだと思います。