10

C ++ライブラリに使用されているJNAへの参照をオンラインで(stackoverflowの一部を含む)見つけましたが、JNAドキュメントで見つけることができるものは何もありません。特に、C++ クラスをラップする方法はないようです。

RTAudio を使用するにはネイティブ アクセスが必要ですが、RTAudio の関数はすべて RTAudio クラスのメンバー関数です。確認のために言っておきますが、JNA は適切な方法ではありませんか?

4

4 に答える 4

17

この質問は、 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は気にしません。

于 2010-02-11T04:48:09.427 に答える
3

Swigを試してください。それはあなたのためにc++クラスのラッパーを作成します。

于 2010-02-11T04:16:22.997 に答える
3

BridJは、限定的な C++ サポート (+ JNAeratorからの完全サポート) を追加する JNA の精神的な子です。あまりにも多くのテンプレートを使用していない場合は、うまくいくかもしれません...

(免責事項: 私は BridJ & JNAerator の作成者です)

于 2013-02-19T17:03:27.793 に答える
1

JNAはネイティブライブラリにアクセスするためのものです。必要なのは Java - COM Bridge だと思います。この場合、無料の代替手段がいくつかあります。

JCOM http://sourceforge.net/projects/jcom

ジェイコブhttp://sourceforge.net/projects/jacob-project

パスでジェイコブを使用して良い結果を得ましたが、少し時代遅れだと思います。

于 2010-02-11T02:00:53.133 に答える