Support the JNI bridge in secondary isolates This requires detaching from the JVM at thread shutdown using a callback that was recently added to the Dart VM.
diff --git a/sky/engine/bindings/jni/dart_jni.cc b/sky/engine/bindings/jni/dart_jni.cc index deaef79..563805f 100644 --- a/sky/engine/bindings/jni/dart_jni.cc +++ b/sky/engine/bindings/jni/dart_jni.cc
@@ -266,6 +266,10 @@ return true; } +void DartJni::OnThreadExit() { + base::android::DetachFromVM(); +} + ScopedJavaLocalRef<jclass> DartJni::GetClass(JNIEnv* env, const char* name) { jobject clazz = env->CallObjectMethod( g_jvm_data->class_loader.obj(),
diff --git a/sky/engine/bindings/jni/dart_jni.h b/sky/engine/bindings/jni/dart_jni.h index 4fc94ca..d9ee55d 100644 --- a/sky/engine/bindings/jni/dart_jni.h +++ b/sky/engine/bindings/jni/dart_jni.h
@@ -28,6 +28,7 @@ static void InitForGlobal(); static void InitForIsolate(); static bool InitJni(); + static void OnThreadExit(); static base::android::ScopedJavaLocalRef<jclass> GetClass( JNIEnv* env, const char* name);
diff --git a/sky/engine/core/script/dart_init.cc b/sky/engine/core/script/dart_init.cc index 75696b5..6a6c7bb 100644 --- a/sky/engine/core/script/dart_init.cc +++ b/sky/engine/core/script/dart_init.cc
@@ -111,6 +111,12 @@ delete dart_state; } +void ThreadExitCallback() { +#ifdef OS_ANDROID + DartJni::OnThreadExit(); +#endif +} + bool IsServiceIsolateURL(const char* url_name) { return url_name != nullptr && String(url_name) == DART_VM_SERVICE_ISOLATE_NAME; @@ -190,6 +196,13 @@ "ui", WTF::MakeUnique<DartClassProvider>(dart_state, "dart:ui")); +#ifdef OS_ANDROID + DartJni::InitForIsolate(); + dart_state->class_library().add_provider( + "jni", + WTF::MakeUnique<DartClassProvider>(dart_state, "dart:jni")); +#endif + if (!snapshot_data.empty()) { CHECK(!LogIfError(Dart_LoadScriptFromSnapshot( snapshot_data.data(), snapshot_data.size()))); @@ -424,7 +437,7 @@ nullptr, // Isolate interrupt callback. nullptr, IsolateShutdownCallback, - nullptr, + ThreadExitCallback, // File IO callbacks. nullptr, nullptr, nullptr, nullptr, // Entroy source