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

Commit 0194377

Browse files
Tzafrir Poupkopetreeftime
authored andcommitted
Fix java objects memory leak
Objects created by jni->NewObject inside callback code blocks are not being released by the JVM as there is still a reference to the object. Those object references are accumulated on the thread stack and eventually occupy all the available space in the heap. Deleting the LocalReference as soon as the object is no longer required allows the GC to dispose those temporary objects Signed-off-by: Tzafrir Poupko <[email protected]>
1 parent fcf01db commit 0194377

File tree

4 files changed

+14
-0
lines changed

4 files changed

+14
-0
lines changed

java/jni/BluetoothAdapter.cxx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ void Java_tinyb_BluetoothAdapter_enablePoweredNotifications(JNIEnv *env, jobject
294294
jobject result = jni_env->NewObject(boolean_cls, constructor, v ? JNI_TRUE : JNI_FALSE);
295295

296296
jni_env->CallVoidMethod(**callback_ptr, method, result);
297+
jni_env->DeleteLocalRef(result);
297298

298299
});
299300
} catch (std::bad_alloc &e) {
@@ -384,6 +385,7 @@ void Java_tinyb_BluetoothAdapter_enableDiscoverableNotifications(JNIEnv *env, jo
384385
jobject result = jni_env->NewObject(boolean_cls, constructor, v ? JNI_TRUE : JNI_FALSE);
385386

386387
jni_env->CallVoidMethod(**callback_ptr, method, result);
388+
jni_env->DeleteLocalRef(result);
387389

388390
});
389391
} catch (std::bad_alloc &e) {
@@ -497,6 +499,7 @@ void Java_tinyb_BluetoothAdapter_enablePairableNotifications(JNIEnv *env, jobjec
497499
jobject result = jni_env->NewObject(boolean_cls, constructor, v ? JNI_TRUE : JNI_FALSE);
498500

499501
jni_env->CallVoidMethod(**callback_ptr, method, result);
502+
jni_env->DeleteLocalRef(result);
500503

501504
});
502505
} catch (std::bad_alloc &e) {
@@ -630,6 +633,7 @@ void Java_tinyb_BluetoothAdapter_enableDiscoveringNotifications(JNIEnv *env, job
630633
jobject result = jni_env->NewObject(boolean_cls, constructor, v ? JNI_TRUE : JNI_FALSE);
631634

632635
jni_env->CallVoidMethod(**callback_ptr, method, result);
636+
jni_env->DeleteLocalRef(result);
633637

634638
});
635639
} catch (std::bad_alloc &e) {

java/jni/BluetoothDevice.cxx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,7 @@ void Java_tinyb_BluetoothDevice_enablePairedNotifications(JNIEnv *env, jobject o
402402
jobject result = jni_env->NewObject(boolean_cls, constructor, v ? JNI_TRUE : JNI_FALSE);
403403

404404
jni_env->CallVoidMethod(**callback_ptr, method, result);
405+
jni_env->DeleteLocalRef(result);
405406

406407
});
407408
} catch (std::bad_alloc &e) {
@@ -492,6 +493,7 @@ void Java_tinyb_BluetoothDevice_enableTrustedNotifications(JNIEnv *env, jobject
492493
jobject result = jni_env->NewObject(boolean_cls, constructor, v ? JNI_TRUE : JNI_FALSE);
493494

494495
jni_env->CallVoidMethod(**callback_ptr, method, result);
496+
jni_env->DeleteLocalRef(result);
495497

496498
});
497499
} catch (std::bad_alloc &e) {
@@ -582,6 +584,7 @@ void Java_tinyb_BluetoothDevice_enableBlockedNotifications(JNIEnv *env, jobject
582584
jobject result = jni_env->NewObject(boolean_cls, constructor, v ? JNI_TRUE : JNI_FALSE);
583585

584586
jni_env->CallVoidMethod(**callback_ptr, method, result);
587+
jni_env->DeleteLocalRef(result);
585588

586589
});
587590
} catch (std::bad_alloc &e) {
@@ -672,6 +675,7 @@ void Java_tinyb_BluetoothDevice_enableRSSINotifications(JNIEnv *env, jobject obj
672675
jobject result = jni_env->NewObject(short_cls, constructor, (jshort) v);
673676

674677
jni_env->CallVoidMethod(**callback_ptr, method, result);
678+
jni_env->DeleteLocalRef(result);
675679

676680
});
677681
} catch (std::bad_alloc &e) {
@@ -742,6 +746,7 @@ void Java_tinyb_BluetoothDevice_enableConnectedNotifications(JNIEnv *env, jobjec
742746
jobject result = jni_env->NewObject(boolean_cls, constructor, v ? JNI_TRUE : JNI_FALSE);
743747

744748
jni_env->CallVoidMethod(**callback_ptr, method, result);
749+
jni_env->DeleteLocalRef(result);
745750

746751
});
747752
} catch (std::bad_alloc &e) {
@@ -945,6 +950,7 @@ void Java_tinyb_BluetoothDevice_enableManufacturerDataNotifications(JNIEnv *env,
945950
}
946951

947952
jni_env->CallVoidMethod(**callback_ptr, method, result);
953+
jni_env->DeleteLocalRef(result);
948954

949955
});
950956
} catch (std::bad_alloc &e) {
@@ -1055,6 +1061,7 @@ void Java_tinyb_BluetoothDevice_enableServiceDataNotifications(JNIEnv *env, jobj
10551061
}
10561062

10571063
jni_env->CallVoidMethod(**callback_ptr, method, result);
1064+
jni_env->DeleteLocalRef(result);
10581065

10591066
});
10601067
} catch (std::bad_alloc &e) {
@@ -1147,6 +1154,7 @@ void Java_tinyb_BluetoothDevice_enableServicesResolvedNotifications(JNIEnv *env,
11471154
jobject result = jni_env->NewObject(boolean_cls, constructor, v ? JNI_TRUE : JNI_FALSE);
11481155

11491156
jni_env->CallVoidMethod(**callback_ptr, method, result);
1157+
jni_env->DeleteLocalRef(result);
11501158

11511159
});
11521160
} catch (std::bad_alloc &e) {

java/jni/BluetoothGattCharacteristic.cxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ void Java_tinyb_BluetoothGattCharacteristic_enableValueNotifications(JNIEnv *env
147147
jni_env->SetByteArrayRegion(result, 0, (jsize)size, (const jbyte *)&v[0]);
148148

149149
jni_env->CallVoidMethod(**callback_ptr, method, result);
150+
jni_env->DeleteLocalRef(result);
150151

151152
});
152153
} catch (std::bad_alloc &e) {

java/jni/BluetoothGattDescriptor.cxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ void Java_tinyb_BluetoothGattDescriptor_enableValueNotifications(JNIEnv *env, jo
220220
jni_env->SetByteArrayRegion(result, 0, (jsize)size, (const jbyte *)&v[0]);
221221

222222
jni_env->CallVoidMethod(**callback_ptr, method, result);
223+
jni_env->DeleteLocalRef(result);
223224

224225
});
225226
} catch (std::bad_alloc &e) {

0 commit comments

Comments
 (0)