Skip to content

Commit c3bba1d

Browse files
ivovandongenjfirebaugh
authored andcommitted
add NewWeakGlobalRef method to Object
1 parent d0ce4f9 commit c3bba1d

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

include/jni/functions.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ namespace jni
162162
}
163163

164164
template < class T >
165-
UniqueWeakGlobalRef<T> NewWeakGlobalRef(JNIEnv& env, T& t)
165+
UniqueWeakGlobalRef<T> NewWeakGlobalRef(JNIEnv& env, T* t)
166166
{
167167
T* result = Wrap<T*>(env.NewWeakGlobalRef(Unwrap(t)));
168168
CheckJavaException(env);

include/jni/object.hpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)