Bug 1410456 - Pass in cubeb JNIEnv instead of JavaVM. r?padenot
MozReview-Commit-ID: Cf8FvZzShVv
--- 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;
}