diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2015-12-26 10:11:36 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2015-12-26 10:11:36 -0800 |
commit | df34679443a0e171b0d2c983d8cd94c539f389a2 (patch) | |
tree | 5d36c67fab57f96f8fbd88db612cc7c55650d27e | |
parent | 9ca47a3e7094b794fad436b59a226aa77619023b (diff) | |
parent | 66668acd42e0c617d5e3ce784a9e747fa04add16 (diff) | |
download | android_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.cpp | 25 |
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) { |