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