GATT JNI - get_gatt_db_cb leaking local refs
Bug: 27835277
Change-Id: I4bd0beb763507ea8a4a43a0f707408757f6ce8e0
diff --git a/jni/com_android_bluetooth_gatt.cpp b/jni/com_android_bluetooth_gatt.cpp
index 2261f63..582d63c 100644
--- a/jni/com_android_bluetooth_gatt.cpp
+++ b/jni/com_android_bluetooth_gatt.cpp
@@ -559,6 +559,7 @@
// class loader to load it.
jobject objectForClass = sCallbackEnv->CallObjectMethod(mCallbacksObj, method_getSampleGattDbElement);
jclass gattDbElementClazz = sCallbackEnv->GetObjectClass(objectForClass);
+ sCallbackEnv->DeleteLocalRef(objectForClass);
jmethodID gattDbElementConstructor = sCallbackEnv->GetMethodID(gattDbElementClazz, "<init>", "()V");
@@ -574,14 +575,13 @@
jobject element = sCallbackEnv->NewObject(gattDbElementClazz, gattDbElementConstructor);
- jfieldID fid;
-
- fid = sCallbackEnv->GetFieldID(gattDbElementClazz, "id", "I");
+ jfieldID fid = sCallbackEnv->GetFieldID(gattDbElementClazz, "id", "I");
sCallbackEnv->SetIntField(element, fid, curr.id);
jobject uuid = sCallbackEnv->NewObject(uuidClazz, uuidConstructor, uuid_msb(&curr.uuid), uuid_lsb(&curr.uuid));
fid = sCallbackEnv->GetFieldID(gattDbElementClazz, "uuid", "java/util/UUID");
sCallbackEnv->SetObjectField(element, fid, uuid);
+ sCallbackEnv->DeleteLocalRef(uuid);
fid = sCallbackEnv->GetFieldID(gattDbElementClazz, "type", "I");
sCallbackEnv->SetIntField(element, fid, curr.type);
@@ -599,11 +599,12 @@
sCallbackEnv->SetIntField(element, fid, curr.properties);
sCallbackEnv->CallBooleanMethod(array, arrayAdd, element);
-
sCallbackEnv->DeleteLocalRef(element);
}
sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onGetGattDb, conn_id, array);
+ sCallbackEnv->DeleteLocalRef(array);
+
checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
}