Skip to content

Commit cc7ce5c

Browse files
committed
Add tests for NewWeakGlobalRef and DeleteWeakGlobalRef
1 parent c3bba1d commit cc7ce5c

File tree

3 files changed

+48
-6
lines changed

3 files changed

+48
-6
lines changed

include/jni/functions.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,11 @@ namespace jni
164164
template < class T >
165165
UniqueWeakGlobalRef<T> NewWeakGlobalRef(JNIEnv& env, T* t)
166166
{
167-
T* result = Wrap<T*>(env.NewWeakGlobalRef(Unwrap(t)));
167+
jobject* obj = Wrap<jobject*>(env.NewWeakGlobalRef(Unwrap(t)));
168168
CheckJavaException(env);
169-
if (!result)
169+
if (t && !obj)
170170
throw std::bad_alloc();
171-
return UniqueWeakGlobalRef<T>(result, WeakGlobalRefDeleter(env));
171+
return UniqueWeakGlobalRef<T>(reinterpret_cast<T*>(obj), WeakGlobalRefDeleter(env));
172172
}
173173

174174
inline void DeleteWeakGlobalRef(JNIEnv& env, UniqueWeakGlobalRef<jobject>&& ref)

test/high_level.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ int main()
7171
assert(classValue == testClass);
7272

7373
static bool calledNewGlobalRef = false;
74+
static bool calledNewWeakGlobalRef = false;
7475

7576
env.functions->NewGlobalRef = [] (JNIEnv*, jobject obj) -> jobject
7677
{
@@ -82,6 +83,16 @@ int main()
8283
{
8384
};
8485

86+
env.functions->NewWeakGlobalRef = [] (JNIEnv*, jobject obj) -> jobject
87+
{
88+
calledNewWeakGlobalRef = true;
89+
return obj;
90+
};
91+
92+
env.functions->DeleteWeakGlobalRef = [] (JNIEnv*, jobject) -> void
93+
{
94+
};
95+
8596
testClass.NewGlobalRef(env);
8697
assert(calledNewGlobalRef);
8798

@@ -90,9 +101,11 @@ int main()
90101

91102
jni::Object<Test> object { objectValue.Ptr() };
92103
object.NewGlobalRef(env);
104+
object.NewWeakGlobalRef(env);
93105

94106
jni::String string { stringValue.Ptr() };
95107
string.NewGlobalRef(env);
108+
string.NewWeakGlobalRef(env);
96109

97110

98111
/// Constructor

test/low_level.cpp

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,37 @@ static void TestNewAndDeleteGlobalRef()
7777
[] { jni::DeleteGlobalRef(env, jni::NewGlobalRef(env, failureValue.Ptr())); }));
7878
}
7979

80+
static void TestNewAndDeleteWeakGlobalRef()
81+
{
82+
static Testable<jni::jobject> objectValue;
83+
static Testable<jni::jclass> classValue;
84+
static Testable<jni::jobject> failureValue;
85+
static TestEnv env;
86+
87+
env.functions->NewWeakGlobalRef = [] (JNIEnv*, jobject obj) -> jobject
88+
{
89+
if (obj == Unwrap(objectValue.Ptr()))
90+
return Unwrap(objectValue.Ptr());
91+
if (obj == Unwrap(classValue.Ptr()))
92+
return Unwrap(classValue.Ptr());
93+
env.exception = true;
94+
return nullptr;
95+
};
96+
97+
env.functions->DeleteWeakGlobalRef = [] (JNIEnv*, jobject obj) -> void
98+
{
99+
if (obj == Unwrap(objectValue.Ptr()))
100+
return;
101+
env.exception = true;
102+
};
103+
104+
assert(objectValue == *jni::NewWeakGlobalRef(env, objectValue.Ptr()));
105+
assert(classValue == *jni::NewWeakGlobalRef(env, classValue.Ptr()));
106+
assert(Throws<jni::PendingJavaException>([] { jni::NewWeakGlobalRef(env, failureValue.Ptr()); }));
107+
assert(Throws<jni::PendingJavaException>(
108+
[] { jni::DeleteWeakGlobalRef(env, jni::NewWeakGlobalRef(env, failureValue.Ptr())); }));
109+
}
110+
80111
static void TestNewObject()
81112
{
82113
static Testable<jni::jclass> classValue;
@@ -227,6 +258,7 @@ int main()
227258
*/
228259

229260
TestNewAndDeleteGlobalRef();
261+
TestNewAndDeleteWeakGlobalRef();
230262

231263
/*
232264
jobject (*NewLocalRef)(JNIEnv*, jobject);
@@ -303,9 +335,6 @@ int main()
303335
304336
const jchar* (*GetStringCritical)(JNIEnv*, jstring, jboolean*);
305337
void (*ReleaseStringCritical)(JNIEnv*, jstring, const jchar*);
306-
307-
jweak (*NewWeakGlobalRef)(JNIEnv*, jobject);
308-
void (*DeleteWeakGlobalRef)(JNIEnv*, jweak);
309338
*/
310339

311340
/*

0 commit comments

Comments
 (0)