I have this code:
JNIEXPORT void package_MyAPI_callback(JNIEnv *env, jobject thiz, jobject caller) {
JavaVM *vm;
env->GetJavaVM(&vm);
jclass callbackClass = (jclass) env->NewGlobalRef(env->FindClass("package/TimeLoadedListenerUIThread"));
jobject cachedCaller = (jobject) env->NewGlobalRef(caller);
jmethodID javaCallback = env->GetMethodID(callbackClass, "onTimeLoaded", "(Z)V");
CppSetCallback([=] {
JNIEnv *bgEnv;
vm->AttachCurrentThread(&bgEnv, NULL);
bgEnv->CallVoidMethod(cachedCaller, javaCallback, false);
bgEnv->DeleteGlobalRef(callbackClass);
bgEnv->DeleteGlobalRef(cachedCaller);
//vm->DetachCurrentThread();
});
}
And somewhere in Kotlin code:
override fun onTimeLoaded(resetToCurrentTime: Boolean) {
activity.runOnUiThread {
activity.updateTimeSelector(resetToCurrentTime) }
}
}
CppSetCallback
sets callback (as functional) to internal core of app. There, the functional is called from std::thread
.
This code runs, but I am not sure if it is correct, because If I call vm->DetachCurrentThread();
app crashes. How should I call detach, or when?