From a90e2f3a2c7d5cadd857ef65922ec8b1b70de964 Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Tue, 22 Aug 2017 17:19:54 +0300 Subject: [PATCH] [android] add GenericWeakReference that can be deleted from any thread --- .../src/jni/generic_global_ref_deleter.hpp | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/platform/android/src/jni/generic_global_ref_deleter.hpp b/platform/android/src/jni/generic_global_ref_deleter.hpp index 4e53e0a0c..7239e361a 100644 --- a/platform/android/src/jni/generic_global_ref_deleter.hpp +++ b/platform/android/src/jni/generic_global_ref_deleter.hpp @@ -18,5 +18,34 @@ struct GenericGlobalRefDeleter { } }; + +template < class TagType > +class GenericWeakObjectRefDeleter; + +template < class TagType = jni::ObjectTag > +using GenericUniqueWeakObject = std::unique_ptr< const jni::Object, GenericWeakObjectRefDeleter >; + +template < class TagType > +class GenericWeakObjectRefDeleter +{ +public: + using pointer = jni::PointerToValue< jni::Object >; + + void operator()(pointer p) const + { + if (p) + { + auto env = AttachEnv(); + env->DeleteWeakGlobalRef(jni::Unwrap(p->Get())); + } + } +}; + +template < class TagType > +GenericUniqueWeakObject SeizeGenericWeakRef(JNIEnv&, jni::Object&& object) +{ + return GenericUniqueWeakObject(jni::PointerToValue>(std::move(object)), GenericWeakObjectRefDeleter()); +}; + } // namespace android } // namespace mbgl