Bug 1410456 - Pass in cubeb JNIEnv instead of JavaVM. r?padenot draft
authorAlex Chronopoulos <achronop@gmail.com>
Thu, 01 Mar 2018 12:11:32 +0200
changeset 761776 29a7cca27289de719f78c7eb4eef190c01d34c83
parent 760843 6f1206ac519752217e61af80885f5947bb69b84e
child 761777 e871ee61e2950a0ecc391ed145cae0e6f3eb438d
push id100996
push userachronop@gmail.com
push dateThu, 01 Mar 2018 13:46:46 +0000
reviewerspadenot
bugs1410456
milestone60.0a1
Bug 1410456 - Pass in cubeb JNIEnv instead of JavaVM. r?padenot MozReview-Commit-ID: Cf8FvZzShVv
media/libcubeb/src/cubeb-jni-instances.h
media/libcubeb/src/cubeb-jni.cpp
--- a/media/libcubeb/src/cubeb-jni-instances.h
+++ b/media/libcubeb/src/cubeb-jni-instances.h
@@ -13,20 +13,20 @@
  *
  * cubeb_stream_get_position()
  *
  * Users that want to use that cubeb API method must "override"
  * the methods bellow to return a valid instance of JavaVM
  * and application's Context object.
  * */
 
-JavaVM *
-cubeb_jni_get_java_vm()
+JNIEnv *
+cubeb_get_jni_env_for_thread()
 {
-  return mozilla::jni::GetVM();
+  return mozilla::jni::GetEnvForThread();
 }
 
 jobject
 cubeb_jni_get_context_instance()
 {
   auto context = mozilla::java::GeckoAppShell::GetApplicationContext();
   return context.Forget();
 }
--- a/media/libcubeb/src/cubeb-jni.cpp
+++ b/media/libcubeb/src/cubeb-jni.cpp
@@ -1,53 +1,33 @@
 #include "jni.h"
 #include <assert.h>
 #include "cubeb-jni-instances.h"
 
 #define AUDIO_STREAM_TYPE_MUSIC 3
 
-JNIEnv *
-cubeb_jni_get_env_for_thread(JavaVM * java_vm)
-{
-    JNIEnv * env = nullptr;
-    if (!java_vm->AttachCurrentThread(&env, nullptr)) {
-        assert(env);
-        return env;
-    }
-
-    assert(false && "Failed to get JNIEnv for thread");
-    return nullptr; // unreachable
-}
-
 struct cubeb_jni {
-  JavaVM * s_java_vm = nullptr;
   jobject s_audio_manager_obj = nullptr;
   jclass s_audio_manager_class = nullptr;
   jmethodID s_get_output_latency_id = nullptr;
 };
 
 extern "C"
 cubeb_jni *
 cubeb_jni_init()
 {
-  JavaVM * javaVM = cubeb_jni_get_java_vm();
   jobject ctx_obj = cubeb_jni_get_context_instance();
-
-  if (!javaVM || !ctx_obj) {
+  JNIEnv * jni_env = cubeb_get_jni_env_for_thread();
+  if (!jni_env || !ctx_obj) {
     return nullptr;
   }
 
-  JNIEnv * jni_env = cubeb_jni_get_env_for_thread(javaVM);
-  assert(jni_env);
-
   cubeb_jni * cubeb_jni_ptr = new cubeb_jni;
   assert(cubeb_jni_ptr);
 
-  cubeb_jni_ptr->s_java_vm = javaVM;
-
   // Find the audio manager object and make it global to call it from another method
   jclass context_class = jni_env->FindClass("android/content/Context");
   jfieldID audio_service_field = jni_env->GetStaticFieldID(context_class, "AUDIO_SERVICE", "Ljava/lang/String;");
   jstring jstr = (jstring)jni_env->GetStaticObjectField(context_class, audio_service_field);
   jmethodID get_system_service_id = jni_env->GetMethodID(context_class, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;");
   jobject audio_manager_obj = jni_env->CallObjectMethod(ctx_obj, get_system_service_id, jstr);
   cubeb_jni_ptr->s_audio_manager_obj = reinterpret_cast<jobject>(jni_env->NewGlobalRef(audio_manager_obj));
 
@@ -64,25 +44,25 @@ cubeb_jni_init()
 
   return cubeb_jni_ptr;
 }
 
 extern "C"
 int cubeb_get_output_latency_from_jni(cubeb_jni * cubeb_jni_ptr)
 {
   assert(cubeb_jni_ptr);
-  JNIEnv * jni_env = cubeb_jni_get_env_for_thread(cubeb_jni_ptr->s_java_vm);
+  JNIEnv * jni_env = cubeb_get_jni_env_for_thread();
   return jni_env->CallIntMethod(cubeb_jni_ptr->s_audio_manager_obj, cubeb_jni_ptr->s_get_output_latency_id, AUDIO_STREAM_TYPE_MUSIC); //param: AudioManager.STREAM_MUSIC
 }
 
 extern "C"
 void cubeb_jni_destroy(cubeb_jni * cubeb_jni_ptr)
 {
   assert(cubeb_jni_ptr);
 
-  JNIEnv * jni_env = cubeb_jni_get_env_for_thread(cubeb_jni_ptr->s_java_vm);
+  JNIEnv * jni_env = cubeb_get_jni_env_for_thread();
   assert(jni_env);
 
   jni_env->DeleteGlobalRef(cubeb_jni_ptr->s_audio_manager_obj);
   jni_env->DeleteGlobalRef(cubeb_jni_ptr->s_audio_manager_class);
 
   delete cubeb_jni_ptr;
 }