diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2017-08-22 17:19:54 +0300 |
---|---|---|
committer | Ivo van Dongen <ivovandongen@users.noreply.github.com> | 2017-08-30 17:18:37 +0300 |
commit | a90e2f3a2c7d5cadd857ef65922ec8b1b70de964 (patch) | |
tree | f790144e4ff5c259b6022b51ffb60c86d4819f44 | |
parent | fae9faab06a6fa800eee890f400035fb8c6a2eb9 (diff) | |
download | qtlocation-mapboxgl-a90e2f3a2c7d5cadd857ef65922ec8b1b70de964.tar.gz |
[android] add GenericWeakReference that can be deleted from any thread
-rw-r--r-- | platform/android/src/jni/generic_global_ref_deleter.hpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/platform/android/src/jni/generic_global_ref_deleter.hpp b/platform/android/src/jni/generic_global_ref_deleter.hpp index 4e53e0a0ce..7239e361a7 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<TagType>, GenericWeakObjectRefDeleter<TagType> >; + +template < class TagType > +class GenericWeakObjectRefDeleter +{ +public: + using pointer = jni::PointerToValue< jni::Object<TagType> >; + + void operator()(pointer p) const + { + if (p) + { + auto env = AttachEnv(); + env->DeleteWeakGlobalRef(jni::Unwrap(p->Get())); + } + } +}; + +template < class TagType > +GenericUniqueWeakObject<TagType> SeizeGenericWeakRef(JNIEnv&, jni::Object<TagType>&& object) +{ + return GenericUniqueWeakObject<TagType>(jni::PointerToValue<jni::Object<TagType>>(std::move(object)), GenericWeakObjectRefDeleter<TagType>()); +}; + } // namespace android } // namespace mbgl |