@@ -26,6 +26,12 @@ namespace jni
26
26
template < class TagType >
27
27
using UniqueObject = std::unique_ptr< const Object<TagType>, ObjectDeleter<TagType> >;
28
28
29
+ template < class TagType >
30
+ class WeakObjectRefDeleter ;
31
+
32
+ template < class TagType >
33
+ using UniqueWeakObject = std::unique_ptr< const Object<TagType>, WeakObjectRefDeleter<TagType> >;
34
+
29
35
template < class TheTag = ObjectTag >
30
36
class Object
31
37
{
@@ -130,6 +136,11 @@ namespace jni
130
136
return Seize (env, Object (jni::NewGlobalRef (env, obj).release ()));
131
137
}
132
138
139
+ UniqueWeakObject<TagType> NewWeakGlobalRef (JNIEnv& env) const
140
+ {
141
+ return SeizeWeakRef (env, Object (jni::NewWeakGlobalRef (env, obj).release ()));
142
+ }
143
+
133
144
template < class OtherTag >
134
145
bool IsInstanceOf (JNIEnv& env, const Class<OtherTag>& clazz) const
135
146
{
@@ -165,6 +176,34 @@ namespace jni
165
176
return UniqueObject<TagType>(PointerToValue<Object<TagType>>(std::move (object)), ObjectDeleter<TagType>(env));
166
177
};
167
178
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
+
168
207
169
208
template < class OutTagType , class InTagType >
170
209
Object<OutTagType> Cast (JNIEnv& env, const Object<InTagType>& object, const Class<OutTagType>& clazz)
0 commit comments