@@ -26,6 +26,12 @@ namespace jni
2626 template < class TagType >
2727 using UniqueObject = std::unique_ptr< const Object<TagType>, ObjectDeleter<TagType> >;
2828
29+ template < class TagType >
30+ class WeakObjectRefDeleter ;
31+
32+ template < class TagType >
33+ using UniqueWeakObject = std::unique_ptr< const Object<TagType>, WeakObjectRefDeleter<TagType> >;
34+
2935 template < class TheTag = ObjectTag >
3036 class Object
3137 {
@@ -130,6 +136,11 @@ namespace jni
130136 return Seize (env, Object (jni::NewGlobalRef (env, obj).release ()));
131137 }
132138
139+ UniqueWeakObject<TagType> NewWeakGlobalRef (JNIEnv& env) const
140+ {
141+ return SeizeWeakRef (env, Object (jni::NewWeakGlobalRef (env, obj).release ()));
142+ }
143+
133144 template < class OtherTag >
134145 bool IsInstanceOf (JNIEnv& env, const Class<OtherTag>& clazz) const
135146 {
@@ -165,6 +176,34 @@ namespace jni
165176 return UniqueObject<TagType>(PointerToValue<Object<TagType>>(std::move (object)), ObjectDeleter<TagType>(env));
166177 };
167178
179+ template < class TagType >
180+ class WeakObjectRefDeleter
181+ {
182+ private:
183+ JNIEnv* env = nullptr ;
184+
185+ public:
186+ using pointer = PointerToValue< Object<TagType> >;
187+
188+ WeakObjectRefDeleter () = default ;
189+ WeakObjectRefDeleter (JNIEnv& e) : env(&e) {}
190+
191+ void operator ()(pointer p) const
192+ {
193+ if (p)
194+ {
195+ assert (env);
196+ env->DeleteWeakGlobalRef (Unwrap (p->Get ()));
197+ }
198+ }
199+ };
200+
201+ template < class TagType >
202+ UniqueWeakObject<TagType> SeizeWeakRef (JNIEnv& env, Object<TagType>&& object)
203+ {
204+ return UniqueWeakObject<TagType>(PointerToValue<Object<TagType>>(std::move (object)), WeakObjectRefDeleter<TagType>(env));
205+ };
206+
168207
169208 template < class OutTagType , class InTagType >
170209 Object<OutTagType> Cast (JNIEnv& env, const Object<InTagType>& object, const Class<OutTagType>& clazz)
0 commit comments