summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2015-12-26 10:11:36 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2015-12-26 10:11:36 -0800
commitdf34679443a0e171b0d2c983d8cd94c539f389a2 (patch)
tree5d36c67fab57f96f8fbd88db612cc7c55650d27e
parent9ca47a3e7094b794fad436b59a226aa77619023b (diff)
parent66668acd42e0c617d5e3ce784a9e747fa04add16 (diff)
downloadandroid_packages_apps_Bluetooth-df34679443a0e171b0d2c983d8cd94c539f389a2.tar.gz
android_packages_apps_Bluetooth-df34679443a0e171b0d2c983d8cd94c539f389a2.tar.bz2
android_packages_apps_Bluetooth-df34679443a0e171b0d2c983d8cd94c539f389a2.zip
Merge "Fix to avoid JNI crashes"
-rw-r--r--jni/com_android_bluetooth_a2dp.cpp25
1 files changed, 24 insertions, 1 deletions
diff --git a/jni/com_android_bluetooth_a2dp.cpp b/jni/com_android_bluetooth_a2dp.cpp
index 13f889464..df8fe9837 100644
--- a/jni/com_android_bluetooth_a2dp.cpp
+++ b/jni/com_android_bluetooth_a2dp.cpp
@@ -58,10 +58,15 @@ static void bta2dp_connection_state_callback(btav_connection_state_t state, bt_b
ALOGI("%s", __FUNCTION__);
+ if (mCallbacksObj == NULL) {
+ ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
+ return;
+ }
if (!checkCallbackThread()) { \
ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
return; \
}
+
addr = sCallbackEnv->NewByteArray(sizeof(bt_bdaddr_t));
if (!addr) {
ALOGE("Fail to new jbyteArray bd addr for connection state");
@@ -81,6 +86,10 @@ static void bta2dp_audio_state_callback(btav_audio_state_t state, bt_bdaddr_t* b
ALOGI("%s", __FUNCTION__);
+ if (mCallbacksObj == NULL) {
+ ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
+ return;
+ }
if (!checkCallbackThread()) { \
ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
return; \
@@ -104,6 +113,10 @@ static void bta2dp_connection_priority_callback(bt_bdaddr_t* bd_addr) {
ALOGI("%s", __FUNCTION__);
+ if (mCallbacksObj == NULL) {
+ ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
+ return;
+ }
if (!checkCallbackThread()) { \
ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
return; \
@@ -125,6 +138,10 @@ static void bta2dp_multicast_enabled_callback(int state) {
ALOGI("%s", __FUNCTION__);
+ if (mCallbacksObj == NULL) {
+ ALOGE("Callbacks Obj is no more valid: '%s", __FUNCTION__);
+ return;
+ }
if (!checkCallbackThread()) { \
ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__); \
return; \
@@ -213,14 +230,20 @@ static void initNative(JNIEnv *env, jobject object, jint maxA2dpConnections,
return;
}
+ mCallbacksObj = env->NewGlobalRef(object);
+
if ( (status = sBluetoothA2dpInterface->init(&sBluetoothA2dpCallbacks,
maxA2dpConnections, multiCastState)) != BT_STATUS_SUCCESS) {
ALOGE("Failed to initialize Bluetooth A2DP, status: %d", status);
sBluetoothA2dpInterface = NULL;
+ if (mCallbacksObj != NULL) {
+ ALOGW("Clean up A2DP callback object");
+ env->DeleteGlobalRef(mCallbacksObj);
+ mCallbacksObj = NULL;
+ }
return;
}
- mCallbacksObj = env->NewGlobalRef(object);
}
static void cleanupNative(JNIEnv *env, jobject object) {