Skip to content
This repository was archived by the owner on Jan 4, 2023. It is now read-only.

Commit b5e293b

Browse files
Tzafrir Poupkopetreeftime
authored andcommitted
Fix native memory leak
jclass objects obtained in callback methods should be manually released when no longer relevant Signed-off-by: Tzafrir Poupko <[email protected]>
1 parent cb7ada6 commit b5e293b

File tree

5 files changed

+39
-2
lines changed

5 files changed

+39
-2
lines changed

java/jni/BluetoothAdapter.cxx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,8 +318,11 @@ void Java_tinyb_BluetoothAdapter_enablePoweredNotifications(JNIEnv *env, jobject
318318
{
319319
jclass notification = search_class(*jni_env, **callback_ptr);
320320
jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false);
321+
jni_env->DeleteLocalRef(notification);
322+
321323
jclass boolean_cls = search_class(*jni_env, "java/lang/Boolean");
322324
jmethodID constructor = search_method(*jni_env, boolean_cls, "<init>", "(Z)V", false);
325+
jni_env->DeleteLocalRef(boolean_cls);
323326

324327
jobject result = jni_env->NewObject(boolean_cls, constructor, v ? JNI_TRUE : JNI_FALSE);
325328

@@ -409,8 +412,11 @@ void Java_tinyb_BluetoothAdapter_enableDiscoverableNotifications(JNIEnv *env, jo
409412
{
410413
jclass notification = search_class(*jni_env, **callback_ptr);
411414
jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false);
415+
jni_env->DeleteLocalRef(notification);
416+
412417
jclass boolean_cls = search_class(*jni_env, "java/lang/Boolean");
413418
jmethodID constructor = search_method(*jni_env, boolean_cls, "<init>", "(Z)V", false);
419+
jni_env->DeleteLocalRef(boolean_cls);
414420

415421
jobject result = jni_env->NewObject(boolean_cls, constructor, v ? JNI_TRUE : JNI_FALSE);
416422

@@ -523,8 +529,11 @@ void Java_tinyb_BluetoothAdapter_enablePairableNotifications(JNIEnv *env, jobjec
523529
{
524530
jclass notification = search_class(*jni_env, **callback_ptr);
525531
jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false);
532+
jni_env->DeleteLocalRef(notification);
533+
526534
jclass boolean_cls = search_class(*jni_env, "java/lang/Boolean");
527535
jmethodID constructor = search_method(*jni_env, boolean_cls, "<init>", "(Z)V", false);
536+
jni_env->DeleteLocalRef(boolean_cls);
528537

529538
jobject result = jni_env->NewObject(boolean_cls, constructor, v ? JNI_TRUE : JNI_FALSE);
530539

@@ -657,8 +666,11 @@ void Java_tinyb_BluetoothAdapter_enableDiscoveringNotifications(JNIEnv *env, job
657666
{
658667
jclass notification = search_class(*jni_env, **callback_ptr);
659668
jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false);
669+
jni_env->DeleteLocalRef(notification);
670+
660671
jclass boolean_cls = search_class(*jni_env, "java/lang/Boolean");
661672
jmethodID constructor = search_method(*jni_env, boolean_cls, "<init>", "(Z)V", false);
673+
jni_env->DeleteLocalRef(boolean_cls);
662674

663675
jobject result = jni_env->NewObject(boolean_cls, constructor, v ? JNI_TRUE : JNI_FALSE);
664676

java/jni/BluetoothDevice.cxx

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -396,10 +396,13 @@ void Java_tinyb_BluetoothDevice_enablePairedNotifications(JNIEnv *env, jobject o
396396
{
397397
jclass notification = search_class(*jni_env, **callback_ptr);
398398
jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false);
399+
jni_env->DeleteLocalRef(notification);
400+
399401
jclass boolean_cls = search_class(*jni_env, "java/lang/Boolean");
400402
jmethodID constructor = search_method(*jni_env, boolean_cls, "<init>", "(Z)V", false);
401403

402404
jobject result = jni_env->NewObject(boolean_cls, constructor, v ? JNI_TRUE : JNI_FALSE);
405+
jni_env->DeleteLocalRef(boolean_cls);
403406

404407
jni_env->CallVoidMethod(**callback_ptr, method, result);
405408
jni_env->DeleteLocalRef(result);
@@ -487,10 +490,13 @@ void Java_tinyb_BluetoothDevice_enableTrustedNotifications(JNIEnv *env, jobject
487490
{
488491
jclass notification = search_class(*jni_env, **callback_ptr);
489492
jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false);
493+
jni_env->DeleteLocalRef(notification);
494+
490495
jclass boolean_cls = search_class(*jni_env, "java/lang/Boolean");
491496
jmethodID constructor = search_method(*jni_env, boolean_cls, "<init>", "(Z)V", false);
492497

493498
jobject result = jni_env->NewObject(boolean_cls, constructor, v ? JNI_TRUE : JNI_FALSE);
499+
jni_env->DeleteLocalRef(boolean_cls);
494500

495501
jni_env->CallVoidMethod(**callback_ptr, method, result);
496502
jni_env->DeleteLocalRef(result);
@@ -578,10 +584,13 @@ void Java_tinyb_BluetoothDevice_enableBlockedNotifications(JNIEnv *env, jobject
578584
{
579585
jclass notification = search_class(*jni_env, **callback_ptr);
580586
jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false);
587+
jni_env->DeleteLocalRef(notification);
588+
581589
jclass boolean_cls = search_class(*jni_env, "java/lang/Boolean");
582590
jmethodID constructor = search_method(*jni_env, boolean_cls, "<init>", "(Z)V", false);
583591

584592
jobject result = jni_env->NewObject(boolean_cls, constructor, v ? JNI_TRUE : JNI_FALSE);
593+
jni_env->DeleteLocalRef(boolean_cls);
585594

586595
jni_env->CallVoidMethod(**callback_ptr, method, result);
587596
jni_env->DeleteLocalRef(result);
@@ -669,10 +678,13 @@ void Java_tinyb_BluetoothDevice_enableRSSINotifications(JNIEnv *env, jobject obj
669678
{
670679
jclass notification = search_class(*jni_env, **callback_ptr);
671680
jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false);
681+
jni_env->DeleteLocalRef(notification);
682+
672683
jclass short_cls = search_class(*jni_env, "java/lang/Short");
673684
jmethodID constructor = search_method(*jni_env, short_cls, "<init>", "(S)V", false);
674685

675686
jobject result = jni_env->NewObject(short_cls, constructor, (jshort) v);
687+
jni_env->DeleteLocalRef(short_cls);
676688

677689
jni_env->CallVoidMethod(**callback_ptr, method, result);
678690
jni_env->DeleteLocalRef(result);
@@ -740,10 +752,13 @@ void Java_tinyb_BluetoothDevice_enableConnectedNotifications(JNIEnv *env, jobjec
740752
{
741753
jclass notification = search_class(*jni_env, **callback_ptr);
742754
jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false);
755+
jni_env->DeleteLocalRef(notification);
756+
743757
jclass boolean_cls = search_class(*jni_env, "java/lang/Boolean");
744758
jmethodID constructor = search_method(*jni_env, boolean_cls, "<init>", "(Z)V", false);
745759

746760
jobject result = jni_env->NewObject(boolean_cls, constructor, v ? JNI_TRUE : JNI_FALSE);
761+
jni_env->DeleteLocalRef(boolean_cls);
747762

748763
jni_env->CallVoidMethod(**callback_ptr, method, result);
749764
jni_env->DeleteLocalRef(result);
@@ -925,6 +940,7 @@ void Java_tinyb_BluetoothDevice_enableManufacturerDataNotifications(JNIEnv *env,
925940
{
926941
jclass notification = search_class(*jni_env, **callback_ptr);
927942
jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false);
943+
jni_env->DeleteLocalRef(notification);
928944

929945
jclass map_cls = search_class(*jni_env, "java/util/HashMap");
930946
jmethodID map_ctor = search_method(*jni_env, map_cls, "<init>",
@@ -938,7 +954,7 @@ void Java_tinyb_BluetoothDevice_enableManufacturerDataNotifications(JNIEnv *env,
938954
"(S)V", false);
939955

940956
jobject result = jni_env->NewObject(map_cls, map_ctor, v.size());
941-
957+
jni_env->DeleteLocalRef(map_cls);
942958
for (auto it: v) {
943959
jbyteArray arr = jni_env->NewByteArray(it.second.size());
944960
jni_env->SetByteArrayRegion(arr, 0, it.second.size(), (const jbyte *)it.second.data());
@@ -951,6 +967,7 @@ void Java_tinyb_BluetoothDevice_enableManufacturerDataNotifications(JNIEnv *env,
951967

952968
jni_env->CallVoidMethod(**callback_ptr, method, result);
953969
jni_env->DeleteLocalRef(result);
970+
jni_env->DeleteLocalRef(short_cls);
954971

955972
});
956973
} catch (std::bad_alloc &e) {
@@ -1040,6 +1057,7 @@ void Java_tinyb_BluetoothDevice_enableServiceDataNotifications(JNIEnv *env, jobj
10401057
{
10411058
jclass notification = search_class(*jni_env, **callback_ptr);
10421059
jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false);
1060+
jni_env->DeleteLocalRef(notification);
10431061

10441062
jclass map_cls = search_class(*jni_env, "java/util/HashMap");
10451063
jmethodID map_ctor = search_method(*jni_env, map_cls, "<init>",
@@ -1049,6 +1067,7 @@ void Java_tinyb_BluetoothDevice_enableServiceDataNotifications(JNIEnv *env, jobj
10491067
false);
10501068

10511069
jobject result = jni_env->NewObject(map_cls, map_ctor, v.size());
1070+
jni_env->DeleteLocalRef(map_cls);
10521071

10531072
for (auto it: v) {
10541073
jbyteArray arr = jni_env->NewByteArray(it.second.size());
@@ -1062,7 +1081,6 @@ void Java_tinyb_BluetoothDevice_enableServiceDataNotifications(JNIEnv *env, jobj
10621081

10631082
jni_env->CallVoidMethod(**callback_ptr, method, result);
10641083
jni_env->DeleteLocalRef(result);
1065-
10661084
});
10671085
} catch (std::bad_alloc &e) {
10681086
raise_java_oom_exception(env, e);
@@ -1148,10 +1166,13 @@ void Java_tinyb_BluetoothDevice_enableServicesResolvedNotifications(JNIEnv *env,
11481166
{
11491167
jclass notification = search_class(*jni_env, **callback_ptr);
11501168
jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false);
1169+
jni_env->DeleteLocalRef(notification);
1170+
11511171
jclass boolean_cls = search_class(*jni_env, "java/lang/Boolean");
11521172
jmethodID constructor = search_method(*jni_env, boolean_cls, "<init>", "(Z)V", false);
11531173

11541174
jobject result = jni_env->NewObject(boolean_cls, constructor, v ? JNI_TRUE : JNI_FALSE);
1175+
jni_env->DeleteLocalRef(boolean_cls);
11551176

11561177
jni_env->CallVoidMethod(**callback_ptr, method, result);
11571178
jni_env->DeleteLocalRef(result);

java/jni/BluetoothGattCharacteristic.cxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ void Java_tinyb_BluetoothGattCharacteristic_enableValueNotifications(JNIEnv *env
141141
{
142142
jclass notification = search_class(*jni_env, **callback_ptr);
143143
jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false);
144+
jni_env->DeleteLocalRef(notification);
144145
unsigned int size = v.size();
145146

146147
jbyteArray result = jni_env->NewByteArray((jsize)size);

java/jni/BluetoothGattDescriptor.cxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ void Java_tinyb_BluetoothGattDescriptor_enableValueNotifications(JNIEnv *env, jo
214214
{
215215
jclass notification = search_class(*jni_env, **callback_ptr);
216216
jmethodID method = search_method(*jni_env, notification, "run", "(Ljava/lang/Object;)V", false);
217+
jni_env->DeleteLocalRef(notification);
217218
unsigned int size = v.size();
218219

219220
jbyteArray result = jni_env->NewByteArray((jsize)size);

java/jni/helper.cxx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ jobject get_bluetooth_type(JNIEnv *env, const char *field_name)
191191
jfieldID b_type_field = search_field(env, b_type_enum, field_name, "L" JAVA_PACKAGE "/BluetoothType;", true);
192192

193193
jobject result = env->GetStaticObjectField(b_type_enum, b_type_field);
194+
env->DeleteLocalRef(b_type_enum);
194195
return result;
195196
}
196197

@@ -207,6 +208,7 @@ jobject get_new_arraylist(JNIEnv *env, unsigned int size, jmethodID *add)
207208

208209
*add = search_method(env, arraylist_class, "add", "(Ljava/lang/Object;)Z", false);
209210

211+
env->DeleteLocalRef(arraylist_class);
210212
return result;
211213
}
212214

0 commit comments

Comments
 (0)