C++ JNI 関数 (以下に含まれる半疑似) 内では、その行に少なくとも 1 つ (場合によっては 2 つ) の追加スレッドが作成されclient_ = new VClient(&callback_)
ます。私はこの関数の完了で十分だと考えましたが、どうやら次の関数 (別の JNICALL 関数) がこの後に「すぐに」呼び出されると、SEGFUALT が発生します (関数はできるだけ早く呼び出されるため、「すぐに」は引用符で囲まれています)。誰かが次のボタンを押すことができます)。new VClient
が次の関数で使用されているため、Init 関数が戻り、次の関数が呼び出されるまでに の作成がまだ完了していないことが原因であるclient_
と考えられます。
私はこのすべてのスレッド化ビジネスにかなり慣れていないため、これが正しい考え方であるかどうかはわかりません。私は順番にコードを実行することに慣れています。したがって、コードが行から移動するのは、client_
その行のすべてが完了したためです。コードがこの行から移動し、新しいものVClient
が完全に作成される前に JNI Init 関数から戻ることは可能ですか? もしそうなら、クラス/オブジェクトの作成が完了するまでこの関数を待機させるにはどうすればよいですか?
JNIEXPORT void JNICALL Java_com_ClassDir_Init(JNIEnv *env, jobject obj)
{
LOGI("%s", __PRETTY_FUNCTION__);
if(!client_)
{
LOGI("Initializing client");
client_ = new VClient(&callback_);
[Bunch of JNI/JAVA class and methodID lookup and saving]
}
else
LOGI("Client already initialized");
}
*これcallback_
は、列挙型シグナルを JNI/JAVA に送信してプログラムの進行状況を更新する処理を行うクラスです。