summaryrefslogtreecommitdiffstats
path: root/core/jni/android_server_BluetoothA2dpService.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/jni/android_server_BluetoothA2dpService.cpp')
-rw-r--r--core/jni/android_server_BluetoothA2dpService.cpp37
1 files changed, 26 insertions, 11 deletions
diff --git a/core/jni/android_server_BluetoothA2dpService.cpp b/core/jni/android_server_BluetoothA2dpService.cpp
index 062f893..fe94642 100644
--- a/core/jni/android_server_BluetoothA2dpService.cpp
+++ b/core/jni/android_server_BluetoothA2dpService.cpp
@@ -45,19 +45,19 @@ static jmethodID method_onSinkPlaying;
static jmethodID method_onSinkStopped;
typedef struct {
- JNIEnv *env;
+ JavaVM *vm;
+ int envVer;
DBusConnection *conn;
jobject me; // for callbacks to java
} native_data_t;
static native_data_t *nat = NULL; // global native data
-extern event_loop_native_data_t *event_loop_nat; // for the event loop JNIEnv
#endif
#ifdef HAVE_BLUETOOTH
-static void onConnectSinkResult(DBusMessage *msg, void *user);
-static void onDisconnectSinkResult(DBusMessage *msg, void *user);
+static void onConnectSinkResult(DBusMessage *msg, void *user, void *nat);
+static void onDisconnectSinkResult(DBusMessage *msg, void *user, void *nat);
#endif
/* Returns true on success (even if adapter is present but disabled).
@@ -71,7 +71,8 @@ static bool initNative(JNIEnv* env, jobject object) {
LOGE("%s: out of memory!", __FUNCTION__);
return false;
}
- nat->env = env;
+ env->GetJavaVM( &(nat->vm) );
+ nat->envVer = env->GetVersion();
nat->me = env->NewGlobalRef(object);
DBusError err;
@@ -175,7 +176,8 @@ static jboolean connectSinkNative(JNIEnv *env, jobject object, jstring path) {
bool ret =
dbus_func_args_async(env, nat->conn, -1,
- onConnectSinkResult, (void *)c_path_copy, c_path,
+ onConnectSinkResult, (void *)c_path_copy, nat,
+ c_path,
"org.bluez.audio.Sink", "Connect",
DBUS_TYPE_INVALID);
@@ -202,7 +204,8 @@ static jboolean disconnectSinkNative(JNIEnv *env, jobject object,
bool ret =
dbus_func_args_async(env, nat->conn, -1,
- onDisconnectSinkResult, (void *)c_path_copy, c_path,
+ onDisconnectSinkResult, (void *)c_path_copy, nat,
+ c_path,
"org.bluez.audio.Sink", "Disconnect",
DBUS_TYPE_INVALID);
env->ReleaseStringUTFChars(path, c_path);
@@ -233,13 +236,19 @@ static jboolean isSinkConnectedNative(JNIEnv *env, jobject object, jstring path)
}
#ifdef HAVE_BLUETOOTH
-static void onConnectSinkResult(DBusMessage *msg, void *user) {
+static void onConnectSinkResult(DBusMessage *msg, void *user, void *natData) {
LOGV(__FUNCTION__);
char *c_path = (char *)user;
DBusError err;
+ JNIEnv *env;
+
+ if (nat->vm->GetEnv((void**)&env, nat->envVer) < 0) {
+ LOGE("%s: error finding Env for our VM\n", __FUNCTION__);
+ return;
+ }
+
dbus_error_init(&err);
- JNIEnv *env = event_loop_nat->env;
LOGV("... path = %s", c_path);
if (dbus_set_error_from_message(&err, msg)) {
@@ -258,13 +267,19 @@ static void onConnectSinkResult(DBusMessage *msg, void *user) {
free(c_path);
}
-static void onDisconnectSinkResult(DBusMessage *msg, void *user) {
+static void onDisconnectSinkResult(DBusMessage *msg, void *user, void *natData) {
LOGV(__FUNCTION__);
char *c_path = (char *)user;
DBusError err;
+ JNIEnv *env;
+
+ if (nat->vm->GetEnv((void**)&env, nat->envVer) < 0) {
+ LOGE("%s: error finding Env for our VM\n", __FUNCTION__);
+ return;
+ }
+
dbus_error_init(&err);
- JNIEnv *env = event_loop_nat->env;
LOGV("... path = %s", c_path);
if (dbus_set_error_from_message(&err, msg)) {