diff --git a/include/ntcore_c.h b/include/ntcore_c.h index 183350fc36..5b35f10265 100644 --- a/include/ntcore_c.h +++ b/include/ntcore_c.h @@ -273,6 +273,8 @@ unsigned int NT_AddConnectionListener(void *data, int immediate_notify); void NT_RemoveConnectionListener(unsigned int conn_listener_uid); +int NT_NotifierDestroyed(); + /* * Remote Procedure Call Functions */ diff --git a/include/ntcore_cpp.h b/include/ntcore_cpp.h index 5a15ae6659..88929124c3 100644 --- a/include/ntcore_cpp.h +++ b/include/ntcore_cpp.h @@ -195,6 +195,8 @@ unsigned int AddConnectionListener(ConnectionListenerCallback callback, bool immediate_notify); void RemoveConnectionListener(unsigned int conn_listener_uid); +bool NotifierDestroyed(); + /* * Remote Procedure Call Functions */ diff --git a/java/lib/NetworkTablesJNI.cpp b/java/lib/NetworkTablesJNI.cpp index c963d2a0c9..80fbc236f6 100644 --- a/java/lib/NetworkTablesJNI.cpp +++ b/java/lib/NetworkTablesJNI.cpp @@ -108,7 +108,7 @@ class JavaGlobal { JavaGlobal(JNIEnv *env, T obj) : m_obj(static_cast(env->NewGlobalRef(obj))) {} ~JavaGlobal() { - if (!jvm) return; + if (!jvm || nt::NotifierDestroyed()) return; JNIEnv *env; if (jvm->AttachCurrentThread(reinterpret_cast(&env), nullptr) != JNI_OK) @@ -133,7 +133,7 @@ class JavaWeakGlobal { JavaWeakGlobal(JNIEnv *env, T obj) : m_obj(static_cast(env->NewWeakGlobalRef(obj))) {} ~JavaWeakGlobal() { - if (!jvm) return; + if (!jvm || nt::NotifierDestroyed()) return; JNIEnv *env; if (jvm->AttachCurrentThread(reinterpret_cast(&env), nullptr) != JNI_OK) diff --git a/ntcore.def b/ntcore.def index 5e36de5d0e..586dbe2bbb 100644 --- a/ntcore.def +++ b/ntcore.def @@ -73,6 +73,7 @@ NT_SetEntryStringArray @75 NT_DisposeEntryInfoArray @76 NT_AllocateCharArray @77 NT_FreeCharArray @78 +NT_NotifierDestroyed @79 ; JNI functions JNI_OnLoad diff --git a/src/Notifier.cpp b/src/Notifier.cpp index ec52f48f6a..23f746d35f 100644 --- a/src/Notifier.cpp +++ b/src/Notifier.cpp @@ -10,12 +10,17 @@ using namespace nt; ATOMIC_STATIC_INIT(Notifier) +bool Notifier::s_destroyed = false; Notifier::Notifier() { m_active = false; + s_destroyed = false; } -Notifier::~Notifier() { Stop(); } +Notifier::~Notifier() { + s_destroyed = true; + Stop(); +} void Notifier::Start() { { diff --git a/src/Notifier.h b/src/Notifier.h index 763681e3f1..daa9309501 100644 --- a/src/Notifier.h +++ b/src/Notifier.h @@ -34,6 +34,7 @@ class Notifier { void Stop(); bool active() const { return m_active; } + static bool destroyed() { return s_destroyed; } unsigned int AddEntryListener(StringRef prefix, EntryListenerCallback callback); @@ -86,6 +87,7 @@ class Notifier { std::thread m_thread; ATOMIC_STATIC_DECL(Notifier) + static bool s_destroyed; }; } // namespace nt diff --git a/src/ntcore_c.cpp b/src/ntcore_c.cpp index 696d1a9b59..266fabfd9c 100644 --- a/src/ntcore_c.cpp +++ b/src/ntcore_c.cpp @@ -200,6 +200,8 @@ void NT_RemoveConnectionListener(unsigned int conn_listener_uid) { nt::RemoveConnectionListener(conn_listener_uid); } +int NT_NotifierDestroyed() { return nt::NotifierDestroyed(); } + /* * Remote Procedure Call Functions */ diff --git a/src/ntcore_cpp.cpp b/src/ntcore_cpp.cpp index 14a7cd60c2..960151d597 100644 --- a/src/ntcore_cpp.cpp +++ b/src/ntcore_cpp.cpp @@ -91,6 +91,8 @@ void RemoveConnectionListener(unsigned int conn_listener_uid) { Notifier::GetInstance().RemoveConnectionListener(conn_listener_uid); } +bool NotifierDestroyed() { return Notifier::destroyed(); } + /* * Remote Procedure Call Functions */