diff options
Diffstat (limited to 'platform/android/src/jni')
-rw-r--r-- | platform/android/src/jni/generic_global_ref_deleter.hpp | 42 | ||||
-rw-r--r-- | platform/android/src/jni/local_object.hpp | 33 |
2 files changed, 18 insertions, 57 deletions
diff --git a/platform/android/src/jni/generic_global_ref_deleter.hpp b/platform/android/src/jni/generic_global_ref_deleter.hpp index 7239e361a7..b865ee9f8b 100644 --- a/platform/android/src/jni/generic_global_ref_deleter.hpp +++ b/platform/android/src/jni/generic_global_ref_deleter.hpp @@ -12,39 +12,33 @@ namespace android { struct GenericGlobalRefDeleter { void operator()(jni::jobject* p) const { if (p) { - auto env = AttachEnv(); - env->DeleteGlobalRef(jni::Unwrap(p)); + AttachEnv()->DeleteGlobalRef(jni::Unwrap(p)); } } }; +struct GenericWeakGlobalRefDeleter { + void operator()(jni::jobject* p) const { + if (p) { + AttachEnv()->DeleteWeakGlobalRef(jni::Unwrap(p)); + } + } +}; -template < class TagType > -class GenericWeakObjectRefDeleter; - -template < class TagType = jni::ObjectTag > -using GenericUniqueWeakObject = std::unique_ptr< const jni::Object<TagType>, GenericWeakObjectRefDeleter<TagType> >; +template < class T > +using GenericGlobal = jni::UniquePointerlike< T, GenericGlobalRefDeleter >; -template < class TagType > -class GenericWeakObjectRefDeleter -{ -public: - using pointer = jni::PointerToValue< jni::Object<TagType> >; +template < class T > +using GenericWeak = jni::UniquePointerlike< T, GenericWeakGlobalRefDeleter >; - void operator()(pointer p) const - { - if (p) - { - auto env = AttachEnv(); - env->DeleteWeakGlobalRef(jni::Unwrap(p->Get())); - } - } +template < class T > +GenericGlobal<T> SeizeGenericGlobal(T&& t) { + return GenericGlobal<T>(std::move(t), GenericGlobalRefDeleter()); }; -template < class TagType > -GenericUniqueWeakObject<TagType> SeizeGenericWeakRef(JNIEnv&, jni::Object<TagType>&& object) -{ - return GenericUniqueWeakObject<TagType>(jni::PointerToValue<jni::Object<TagType>>(std::move(object)), GenericWeakObjectRefDeleter<TagType>()); +template < class T > +GenericWeak<T> SeizeGenericWeak(T&& t) { + return GenericWeak<T>(std::move(t), GenericWeakGlobalRefDeleter()); }; } // namespace android diff --git a/platform/android/src/jni/local_object.hpp b/platform/android/src/jni/local_object.hpp deleted file mode 100644 index 00fc4a1933..0000000000 --- a/platform/android/src/jni/local_object.hpp +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include <jni/jni.hpp> - -namespace jni { - - class LocalRefDeleter { - private: - JNIEnv* env = nullptr; - - public: - LocalRefDeleter() = default; - LocalRefDeleter(JNIEnv& e) : env(&e) {} - - void operator()(jobject* object) const { - if (object) { - assert(env); - DeleteLocalRef(*env, object); - } - } - }; - - template < class T > - using LocalObject = std::unique_ptr< T, LocalRefDeleter >; - - /** - * Use a LocalObject to discard of local references as soon as possible - */ - template < class T > - LocalObject<T> NewLocalObject(JNIEnv& env, T* t) { - return LocalObject<T>(t, LocalRefDeleter(env)); - } -} |