Skip to content

Commit b5974f7

Browse files
authored
Merge pull request #610 from ButterscotchV/fix-jni-refs
Fix global JNI class references
2 parents b111735 + 9681d18 commit b5974f7

File tree

1 file changed

+19
-4
lines changed

1 file changed

+19
-4
lines changed

src/main/c/Windows/SerialPort_Windows.c

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@
4343
#include "WindowsHelperFunctions.h"
4444

4545
// Cached class, method, and field IDs
46-
jclass serialCommClass;
47-
jclass jniErrorClass;
46+
jclass serialCommClass = NULL;
47+
jclass jniErrorClass = NULL;
4848
jmethodID serialCommConstructor;
4949
jfieldID serialPortHandleField;
5050
jfieldID comPortField;
@@ -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)