diff --git a/lib/src/main/cpp/macros.h b/lib/src/main/cpp/macros.h index 46201d5..5a31e51 100644 --- a/lib/src/main/cpp/macros.h +++ b/lib/src/main/cpp/macros.h @@ -53,6 +53,9 @@ catch(const zim::ZimFileFormatError& e) { \ } catch(const zim::EntryNotFound& e) { \ throwException(env, "org/kiwix/libzim/EntryNotFoundException", e.what()); \ return RET; \ +} catch (const NativeHandleDisposedException& e) { \ + throwException(env, "java/lang/IllegalStateException", e.what()); \ + return RET; \ } catch (const std::ios_base::failure& e) { \ throwException(env, "java/io/IOException", e.what()); \ return RET; \ diff --git a/lib/src/main/cpp/utils.h b/lib/src/main/cpp/utils.h index 9324adf..a4beb3f 100644 --- a/lib/src/main/cpp/utils.h +++ b/lib/src/main/cpp/utils.h @@ -96,6 +96,11 @@ inline void setHandle(JNIEnv* env, jobject thisObj, Args && ...args) } #define SET_HANDLE(NATIVE_TYPE, OBJ, VALUE) setHandle(env, OBJ, VALUE) +class NativeHandleDisposedException : public std::runtime_error { +public: + explicit NativeHandleDisposedException(const std::string& message) + : std::runtime_error(message) {} +}; // Return a shared_ptr for the handle template @@ -104,6 +109,9 @@ shared_ptr getPtr(JNIEnv* env, jobject thisObj, const char* handleName = "nat jclass thisClass = env->GetObjectClass(thisObj); jfieldID fidNumber = env->GetFieldID(thisClass, handleName, "J"); auto handle = reinterpret_cast*>(env->GetLongField(thisObj, fidNumber)); + if (handle == nullptr) { + throw NativeHandleDisposedException("The native object has already been disposed"); + } return *handle; } #define GET_PTR(NATIVE_TYPE) getPtr(env, thisObj)