3

Java オブジェクトのメソッドを呼び出す必要があるネイティブ スレッド (JVM に接続されていない) で構成される Android アプリケーションがあります。

私がこれを行うつもりだった方法は、関連する Java オブジェクトから呼び出す JNI 関数を作成することでした。これにより、必要な Java オブジェクト メソッド ID、JNIEnv、およびオブジェクト参照を静的なネイティブ データ構造で取得してキャッシュできるようになりました。私のネイティブ スレッドは、必要なメソッドに (安全にスレッド化して) アクセスできます (例: (*env)->CallVoidMethod(env, this, JavaMethodID, ...) などを使用)。

JNIEnv ポインターはスレッド間で共有できず、JVM に接続されているスレッドのみがこの種のことを実行できることを読んだので、このアプローチがうまくいくとは確信していません...

これは実行可能なアプローチですか?

4

1 に答える 1

5
  1. JNI_OnLoad、キャッシュJavaVM*。これが、スレッド間で永続的かつ有効な唯一のものです。
  2. ネイティブスレッドを設定したらすぐに、を呼び出しAttachCurrentThreadて取得JNIEnv*します。これは、その単一スレッドに対してのみ有効です。
  3. JavaVM*で、 es、s、sをJNIEnv*調べます。これらは、接続した単一のスレッドに対してのみ有効です。jclassjobjectjmethodID
  4. jclassesとjobjectsをグローバル参照に変換して、スレッド間で存続するようにします。jmethodID■グローバル化する必要はありません。それらはジョブジェクトではありません。
  5. それ以降のネイティブスレッドでは、そのスレッドAttachCurrentThreadの有効なものを取得するために再度呼び出す必要がありJNIEnv*ます。
  6. 作成されたグローバル参照が不要になった場合は、削除することを忘れないでください(JNI_OnUnload遅くとも)
于 2012-11-16T13:48:10.277 に答える