1

ここStackOverflowを含め、いくつかの調査を行いましたが、まだ対処すべき問題がいくつかあり、あなたの助けが必要です.

そのため、サードパーティの C++ ライブラリのラッパーとして使用される Java ライブラリがあります。この C++ ライブラリには、すべてのロジックがあります。そのため、非同期の動作があり、イベントの通知を受け取るためにコールバックを登録する必要があります。Java からコールバックを登録し、Java でそれぞれのイベントの通知を受け取れるようにしたいと考えています。

現在、私は次のようなものを持っています:

  1. コールバックを登録するための Java メソッド (このコールバックは Java で登録されます)、およびサードパーティ ライブラリにコールバックを登録する C++ の「ネイティブ」メソッドを呼び出すための Java メソッド (これは C++ を介して行われます)。
  2. 「fireMyEvent」のような名前の別の Java メソッドは、サードパーティの lib コールバック (C++ から) によって呼び出されます。

ここでの問題は、サードパーティの lib コールバックが起動されたときに、JNIEnv にも jobject にもアクセスできないことです。

ここ StackOverflow で、JavaVM ポインターをキャッシュして JNIEnv ポインターにアクセスする方法を見てきました。それにもかかわらず、私の CallVoidMethod を呼び出すことができるようにするために、jobject インスタンスにアクセスする方法がわかりません。

env->CallVoidMethod(theJObjectThatIWant, methodId, ...)

サードパーティのライブラリにコールバックを登録する C++ メソッドの呼び出し中にジョブジェクトをキャッシュすることについて考えましたが、複数の「Java ラッパー オブジェクト」があるシナリオでこれが受け入れられるかどうかはわかりません (I' m は、アプリケーションで JNI を介して C++ 機能をラップするオブジェクトを指します。

この状況を打破するためのあなたの提案は何ですか?

問題が明確になったことを願っています。私の調査がこのフォーラムで既存の回答を見つけるのに十分でなかった場合はお詫び申し上げます:(。

多くの感謝と敬意を表します。

編集: 「 CallVoidMethod 」メソッドを実行する「アクセス違反」が発生するため、「 jobject」のキャッシュが機能していないようです。

4

1 に答える 1

0

ネイティブ呼び出しの終了後も Java 参照をキャッシュするには、グローバル参照が必要です。

この JNI リファレンス の「ローカルおよびグローバル参照」を参照してください

于 2012-05-17T16:14:52.547 に答える