diff --git a/java/jni/YogaJniException.cpp b/java/jni/YogaJniException.cpp index 77aa3763..5d6bfbfe 100644 --- a/java/jni/YogaJniException.cpp +++ b/java/jni/YogaJniException.cpp @@ -19,18 +19,19 @@ YogaJniException::YogaJniException() { static const jmethodID methodId = facebook::yoga::vanillajni::getMethodId( getCurrentEnv(), cl, "", "()V"); auto throwable = getCurrentEnv()->NewObject(cl, methodId); - throwable_ = make_global_ref(static_cast(throwable)); + throwable_ = + newGlobalRef(getCurrentEnv(), static_cast(throwable)); } YogaJniException::YogaJniException(jthrowable throwable) { - throwable_ = make_global_ref(throwable); + throwable_ = newGlobalRef(getCurrentEnv(), throwable); } YogaJniException::YogaJniException(YogaJniException&& rhs) : throwable_(std::move(rhs.throwable_)) {} YogaJniException::YogaJniException(const YogaJniException& rhs) { - throwable_ = make_global_ref(rhs.throwable_.get()); + throwable_ = newGlobalRef(getCurrentEnv(), rhs.throwable_.get()); } YogaJniException::~YogaJniException() { @@ -42,7 +43,9 @@ YogaJniException::~YogaJniException() { } ScopedLocalRef YogaJniException::getThrowable() const noexcept { - return make_local_ref(getCurrentEnv(), throwable_.get()); + return make_local_ref( + getCurrentEnv(), + static_cast(getCurrentEnv()->NewLocalRef(throwable_.get()))); } } // namespace vanillajni } // namespace yoga diff --git a/java/jni/common.cpp b/java/jni/common.cpp index 0cc37333..143c695f 100644 --- a/java/jni/common.cpp +++ b/java/jni/common.cpp @@ -96,6 +96,16 @@ ScopedGlobalRef newGlobalRef(JNIEnv* env, jobject obj) { return make_global_ref(result); } + +ScopedGlobalRef newGlobalRef(JNIEnv* env, jthrowable obj) { + jthrowable result = static_cast(env->NewGlobalRef(obj)); + + if (!result) { + logErrorMessageAndDie("Could not obtain global reference from object"); + } + + return make_global_ref(result); +} } // namespace vanillajni } // namespace yoga } // namespace facebook diff --git a/java/jni/common.h b/java/jni/common.h index eebf8e9c..19eca6a4 100644 --- a/java/jni/common.h +++ b/java/jni/common.h @@ -69,6 +69,8 @@ callStaticObjectMethod(JNIEnv* env, jclass clazz, jmethodID methodId, ...); * reference out of it. If any error happens, aborts the process. */ ScopedGlobalRef newGlobalRef(JNIEnv* env, jobject obj); + +ScopedGlobalRef newGlobalRef(JNIEnv* env, jthrowable obj); } // namespace vanillajni } // namespace yoga } // namespace facebook