Skip to content

Commit c06e3a1

Browse files
committed
Use global references for cached jclass
1 parent 6939113 commit c06e3a1

File tree

1 file changed

+17
-2
lines changed

1 file changed

+17
-2
lines changed

src/main/c/Windows/SerialPort_Windows.c

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -627,9 +627,13 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
627627
jint jniVersion = JNI_VERSION_1_2;
628628
if ((*jvm)->GetEnv(jvm, (void**)&env, jniVersion))
629629
return JNI_ERR;
630-
serialCommClass = (*env)->FindClass(env, "com/fazecast/jSerialComm/SerialPort");
630+
jclass localSerialCommClass = (*env)->FindClass(env, "com/fazecast/jSerialComm/SerialPort");
631+
if (!localSerialCommClass) return JNI_ERR;
632+
serialCommClass = (*env)->NewGlobalRef(env, localSerialCommClass);
631633
if (!serialCommClass) return JNI_ERR;
632-
jniErrorClass = (*env)->FindClass(env, "java/lang/Exception");
634+
jclass localJniErrorClass = (*env)->FindClass(env, "java/lang/Exception");
635+
if (!localJniErrorClass) return JNI_ERR;
636+
jniErrorClass = (*env)->NewGlobalRef(env, localJniErrorClass);
633637
if (!jniErrorClass) return JNI_ERR;
634638

635639
// Cache Java fields as global references
@@ -730,6 +734,17 @@ JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *jvm, void *reserved)
730734
for (int i = 0; i < serialPorts.length; ++i)
731735
if (serialPorts.ports[i]->handle != INVALID_HANDLE_VALUE)
732736
Java_com_fazecast_jSerialComm_SerialPort_closePortNative(env, jniErrorClass, (jlong)(intptr_t)serialPorts.ports[i]);
737+
738+
if (serialCommClass)
739+
{
740+
(*env)->DeleteGlobalRef(env, serialCommClass);
741+
serialCommClass = NULL;
742+
}
743+
if (jniErrorClass)
744+
{
745+
(*env)->DeleteGlobalRef(env, jniErrorClass);
746+
jniErrorClass = NULL;
747+
}
733748
}
734749

735750
JNIEXPORT void JNICALL Java_com_fazecast_jSerialComm_SerialPort_uninitializeLibrary(JNIEnv *env, jclass serialComm)

0 commit comments

Comments
 (0)