Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 49529ea1 authored by Jack He's avatar Jack He Committed by Automerger Merge Worker
Browse files

Merge "Fix NPE of mAdvertiseCallbacksObj in JNI thread" into tm-dev am: 56651713 am: de7372c7

parents 4b4a95b0 de7372c7
Loading
Loading
Loading
Loading
+27 −14
Original line number Original line Diff line number Diff line
@@ -16,17 +16,18 @@


#define LOG_TAG "BtGatt.JNI"
#define LOG_TAG "BtGatt.JNI"


#include "com_android_bluetooth.h"
#include "hardware/bt_gatt.h"
#include "utils/Log.h"

#include <base/bind.h>
#include <base/bind.h>
#include <base/callback.h>
#include <base/callback.h>
#include <cutils/log.h>
#include <string.h>
#include <string.h>

#include <array>
#include <array>
#include <memory>
#include <memory>
#include <shared_mutex>


#include <cutils/log.h>
#include "com_android_bluetooth.h"
#include "hardware/bt_gatt.h"
#include "utils/Log.h"
#define info(fmt, ...) ALOGI("%s(L%d): " fmt, __func__, __LINE__, ##__VA_ARGS__)
#define info(fmt, ...) ALOGI("%s(L%d): " fmt, __func__, __LINE__, ##__VA_ARGS__)
#define debug(fmt, ...) \
#define debug(fmt, ...) \
  ALOGD("%s(L%d): " fmt, __func__, __LINE__, ##__VA_ARGS__)
  ALOGD("%s(L%d): " fmt, __func__, __LINE__, ##__VA_ARGS__)
@@ -191,6 +192,7 @@ static const btgatt_interface_t* sGattIf = NULL;
static jobject mCallbacksObj = NULL;
static jobject mCallbacksObj = NULL;
static jobject mAdvertiseCallbacksObj = NULL;
static jobject mAdvertiseCallbacksObj = NULL;
static jobject mPeriodicScanCallbacksObj = NULL;
static jobject mPeriodicScanCallbacksObj = NULL;
static std::shared_mutex callbacks_mutex;


/**
/**
 * BTA client callbacks
 * BTA client callbacks
@@ -802,8 +804,9 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {


  void OnAdvertisingSetStarted(int reg_id, uint8_t advertiser_id,
  void OnAdvertisingSetStarted(int reg_id, uint8_t advertiser_id,
                               int8_t tx_power, uint8_t status) {
                               int8_t tx_power, uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onAdvertisingSetStarted, reg_id,
                                 method_onAdvertisingSetStarted, reg_id,
                                 advertiser_id, tx_power, status);
                                 advertiser_id, tx_power, status);
@@ -811,24 +814,27 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {


  void OnAdvertisingEnabled(uint8_t advertiser_id, bool enable,
  void OnAdvertisingEnabled(uint8_t advertiser_id, bool enable,
                            uint8_t status) {
                            uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onAdvertisingEnabled, advertiser_id,
                                 method_onAdvertisingEnabled, advertiser_id,
                                 enable, status);
                                 enable, status);
  }
  }


  void OnAdvertisingDataSet(uint8_t advertiser_id, uint8_t status) {
  void OnAdvertisingDataSet(uint8_t advertiser_id, uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onAdvertisingDataSet, advertiser_id,
                                 method_onAdvertisingDataSet, advertiser_id,
                                 status);
                                 status);
  }
  }


  void OnScanResponseDataSet(uint8_t advertiser_id, uint8_t status) {
  void OnScanResponseDataSet(uint8_t advertiser_id, uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onScanResponseDataSet, advertiser_id,
                                 method_onScanResponseDataSet, advertiser_id,
                                 status);
                                 status);
@@ -836,8 +842,9 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {


  void OnAdvertisingParametersUpdated(uint8_t advertiser_id, int8_t tx_power,
  void OnAdvertisingParametersUpdated(uint8_t advertiser_id, int8_t tx_power,
                                      uint8_t status) {
                                      uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onAdvertisingParametersUpdated,
                                 method_onAdvertisingParametersUpdated,
                                 advertiser_id, tx_power, status);
                                 advertiser_id, tx_power, status);
@@ -845,16 +852,18 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {


  void OnPeriodicAdvertisingParametersUpdated(uint8_t advertiser_id,
  void OnPeriodicAdvertisingParametersUpdated(uint8_t advertiser_id,
                                              uint8_t status) {
                                              uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onPeriodicAdvertisingParametersUpdated,
                                 method_onPeriodicAdvertisingParametersUpdated,
                                 advertiser_id, status);
                                 advertiser_id, status);
  }
  }


  void OnPeriodicAdvertisingDataSet(uint8_t advertiser_id, uint8_t status) {
  void OnPeriodicAdvertisingDataSet(uint8_t advertiser_id, uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onPeriodicAdvertisingDataSet,
                                 method_onPeriodicAdvertisingDataSet,
                                 advertiser_id, status);
                                 advertiser_id, status);
@@ -862,8 +871,9 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {


  void OnPeriodicAdvertisingEnabled(uint8_t advertiser_id, bool enable,
  void OnPeriodicAdvertisingEnabled(uint8_t advertiser_id, bool enable,
                                    uint8_t status) {
                                    uint8_t status) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
    sCallbackEnv->CallVoidMethod(mAdvertiseCallbacksObj,
                                 method_onPeriodicAdvertisingEnabled,
                                 method_onPeriodicAdvertisingEnabled,
                                 advertiser_id, enable, status);
                                 advertiser_id, enable, status);
@@ -871,8 +881,9 @@ class JniAdvertisingCallbacks : AdvertisingCallbacks {


  void OnOwnAddressRead(uint8_t advertiser_id, uint8_t address_type,
  void OnOwnAddressRead(uint8_t advertiser_id, uint8_t address_type,
                        RawAddress address) {
                        RawAddress address) {
    std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
    CallbackEnv sCallbackEnv(__func__);
    CallbackEnv sCallbackEnv(__func__);
    if (!sCallbackEnv.valid()) return;
    if (!sCallbackEnv.valid() || mAdvertiseCallbacksObj == NULL) return;


    ScopedLocalRef<jstring> addr(sCallbackEnv.get(),
    ScopedLocalRef<jstring> addr(sCallbackEnv.get(),
                                 bdaddr2newjstr(sCallbackEnv.get(), &address));
                                 bdaddr2newjstr(sCallbackEnv.get(), &address));
@@ -1998,6 +2009,7 @@ static void advertiseClassInitNative(JNIEnv* env, jclass clazz) {
}
}


static void advertiseInitializeNative(JNIEnv* env, jobject object) {
static void advertiseInitializeNative(JNIEnv* env, jobject object) {
  std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
  if (mAdvertiseCallbacksObj != NULL) {
  if (mAdvertiseCallbacksObj != NULL) {
    ALOGW("Cleaning up Advertise callback object");
    ALOGW("Cleaning up Advertise callback object");
    env->DeleteGlobalRef(mAdvertiseCallbacksObj);
    env->DeleteGlobalRef(mAdvertiseCallbacksObj);
@@ -2008,6 +2020,7 @@ static void advertiseInitializeNative(JNIEnv* env, jobject object) {
}
}


static void advertiseCleanupNative(JNIEnv* env, jobject object) {
static void advertiseCleanupNative(JNIEnv* env, jobject object) {
  std::shared_lock<std::shared_mutex> lock(callbacks_mutex);
  if (mAdvertiseCallbacksObj != NULL) {
  if (mAdvertiseCallbacksObj != NULL) {
    env->DeleteGlobalRef(mAdvertiseCallbacksObj);
    env->DeleteGlobalRef(mAdvertiseCallbacksObj);
    mAdvertiseCallbacksObj = NULL;
    mAdvertiseCallbacksObj = NULL;