[解決済み] 非同期呼び出しでJNIインターフェースポインタ(JNIEnv *)を取得する方法
2023-07-18 23:58:21
質問
JNIインターフェースポインタ(JNIEnv *)は、現在のスレッドでのみ有効であることを知りました。ネイティブメソッド内で新しいスレッドを開始したとします。どのようにしてJavaメソッドに非同期でイベントを送信することができますか?この新しいスレッドは(JNIEnv *)の参照を持つことができないので、(JNIEnv *)のグローバル変数を保存します。(JNIEnv *)のグローバル変数を格納することは、明らかに機能しませんか?
どのように解決するには?
Java から C++ への JNI を使用した同期呼び出し内では、quot;環境" はすでに JVM によって設定されていますが、任意の C++ スレッドから別の方向に進むと、設定されていない可能性があります。
したがって、次のステップに従う必要があります。
-
JVM環境コンテキストを取得するために
GetEnv
-
必要に応じてコンテキストをアタッチするには
AttachCurrentThread
-
通常通り、メソッドを呼び出すには
CallVoidMethod
-
を使用してデタッチします。
DetachCurrentThread
完全な例です。注意 私は過去にこのことについて、より詳細に私の ブログ
JavaVM* g_vm;
env->GetJavaVM(&g_vm);
void callback(int val) {
JNIEnv * g_env;
// double check it's all ok
int getEnvStat = g_vm->GetEnv((void **)&g_env, JNI_VERSION_1_6);
if (getEnvStat == JNI_EDETACHED) {
std::cout << "GetEnv: not attached" << std::endl;
if (g_vm->AttachCurrentThread((void **) &g_env, NULL) != 0) {
std::cout << "Failed to attach" << std::endl;
}
} else if (getEnvStat == JNI_OK) {
//
} else if (getEnvStat == JNI_EVERSION) {
std::cout << "GetEnv: version not supported" << std::endl;
}
g_env->CallVoidMethod(g_obj, g_mid, val);
if (g_env->ExceptionCheck()) {
g_env->ExceptionDescribe();
}
g_vm->DetachCurrentThread();
}
関連
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
配列定数は初期化子でのみ使用可能です。
-
JNIエンカウンターエラー:構造体またはユニオンではない何かでメンバー 'FindClass' のリクエスト
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
代入の左辺は変数でなければならない 解答
-
git pull appears現在のブランチに対するトラッキング情報がありません。
-
switch case文のcaseの後の列挙定数は列挙型なし
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
XMLファイル操作時のjava.util.NoSuchElementExceptionを解決する方法。
-
型に解決できない エラー解決
-
javaの非静的メソッドを静的に参照することができない
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
java.sql.SQLException: 結果セットの開始前
-
ApiModel と @ApiModelProperty の使用法
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ