From 2bd70518410ccd6a25adc876a3619d0b23f92e5a Mon Sep 17 00:00:00 2001 From: LoveSy Date: Tue, 15 Mar 2022 19:01:32 +0800 Subject: [PATCH] Add JNIMonitor --- lsplant/src/main/jni/include/utils/jni_helper.hpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lsplant/src/main/jni/include/utils/jni_helper.hpp b/lsplant/src/main/jni/include/utils/jni_helper.hpp index ce88c26..e1f9a8b 100644 --- a/lsplant/src/main/jni/include/utils/jni_helper.hpp +++ b/lsplant/src/main/jni/include/utils/jni_helper.hpp @@ -96,12 +96,24 @@ class ScopedLocalRef; class JNIScopeFrame { JNIEnv *env_; + DISALLOW_COPY_AND_ASSIGN(JNIScopeFrame); public: JNIScopeFrame(JNIEnv *env, jint size) : env_(env) { env_->PushLocalFrame(size); } ~JNIScopeFrame() { env_->PopLocalFrame(nullptr); } }; +class JNIMonitor { + JNIEnv *env_; + jobject obj_; + + DISALLOW_COPY_AND_ASSIGN(JNIMonitor); +public: + JNIMonitor(JNIEnv *env, jobject obj) : env_(env), obj_(obj) { env_->MonitorEnter(obj_); } + + ~JNIMonitor() { env_->MonitorExit(obj_); } +}; + template concept ScopeOrRaw = std::is_convertible_v || (is_instance_v, ScopedLocalRef> @@ -902,7 +914,7 @@ public: explicit ScopedLocalRef(JNIEnv *env) noexcept : ScopedLocalRef(env, T{nullptr}) {} - ~ScopedLocalRef() { release(); } + ~ScopedLocalRef() { env_->DeleteLocalRef(release()); } void reset(T ptr = nullptr) { if (ptr != local_ref_) {