0

私のアプリケーションは、いくつかのネイティブ コードを含む Android アプリです。

Java コードは new Thread(new Runnable) を介してスレッドを開始します。ネイティブ コードでは、AttachCurrentThread を介してそのスレッドを JVM にアタッチします。

そのスレッドで呼び出されるネイティブ関数は、単純なイベント (ブール変数) をリッスンし、適切な JNIEnv ポインターと jobject を使用して Java 側で 2 つの Java 変数を埋め、void を呼び出す別のネイティブ関数を呼び出す無限ループです。データを表示するメソッド。そのループの理由は、関数を通常どおり呼び出す (実行する割り当てと破棄が多い) オーバーヘッドが非常に大きい可能性が高いためです。

唯一の問題は、JNIEnv ポインターを更新することはできますが、jobject に対してそれを行う方法がわからないことです。

そして、jobjectとは、関数呼び出しを介してネイティブコードに渡されるjobjectを意味します

jint Java_com_example_example_MainActivity_NativeFunc( JNIEnv* env,
                                              jobject obj)
{
    return;
}
4

1 に答える 1

1

Java コードは new Thread(new Runnable) を介してスレッドを開始します。ネイティブ コードでは、AttachCurrentThread を介してそのスレッドを JVM にアタッチします。

Java コードで作成されたスレッドに JVM をアタッチする必要はありません。すでにアタッチされています。

私があなたの質問を正しく理解していれば、jobject一度取得して、後で他のネイティブメソッドでそのオブジェクトにアクセスしたいと思うでしょう。これを実現するには、NewGlobalRefを使用できます。

jobject myGlobalReference = env->NewGlobalRef(obj);

jobjectこれをグローバル C/C++ 変数に格納して、後で使用できます。JVM が停止するか、 DeleteGlobalRefで参照を削除するまで有効です。グローバル参照を削除しない限り、オブジェクトへのすべての Java 参照がなくなった場合、ガベージ コレクションは参照されたオブジェクトを収集しないことに注意してください。

于 2012-09-07T18:20:00.713 に答える