diff --git a/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNIVanilla.cpp b/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNIVanilla.cpp index 9835758f8b5..9a38c5755c0 100644 --- a/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNIVanilla.cpp +++ b/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNIVanilla.cpp @@ -352,25 +352,29 @@ static void jni_YGNodeCalculateLayoutJNI( jlongArray nativePointers, jobjectArray javaNodes) { - void* layoutContext = nullptr; - auto map = PtrJNodeMapVanilla{}; - if (nativePointers) { - size_t nativePointersSize = env->GetArrayLength(nativePointers); - jlong result[nativePointersSize]; - env->GetLongArrayRegion(nativePointers, 0, nativePointersSize, result); + try { + void* layoutContext = nullptr; + auto map = PtrJNodeMapVanilla{}; + if (nativePointers) { + size_t nativePointersSize = env->GetArrayLength(nativePointers); + jlong result[nativePointersSize]; + env->GetLongArrayRegion(nativePointers, 0, nativePointersSize, result); - map = PtrJNodeMapVanilla{result, nativePointersSize, javaNodes}; - layoutContext = ↦ + map = PtrJNodeMapVanilla{result, nativePointersSize, javaNodes}; + layoutContext = ↦ + } + + const YGNodeRef root = _jlong2YGNodeRef(nativePointer); + YGNodeCalculateLayoutWithContext( + root, + static_cast(width), + static_cast(height), + YGNodeStyleGetDirection(_jlong2YGNodeRef(nativePointer)), + layoutContext); + YGTransferLayoutOutputsRecursive(env, obj, root, layoutContext); + } catch (jthrowable throwable) { + env->Throw(throwable); } - - const YGNodeRef root = _jlong2YGNodeRef(nativePointer); - YGNodeCalculateLayoutWithContext( - root, - static_cast(width), - static_cast(height), - YGNodeStyleGetDirection(_jlong2YGNodeRef(nativePointer)), - layoutContext); - YGTransferLayoutOutputsRecursive(env, obj, root, layoutContext); } static void jni_YGNodeMarkDirtyJNI( diff --git a/ReactAndroid/src/main/jni/first-party/yogajni/jni/corefunctions.cpp b/ReactAndroid/src/main/jni/first-party/yogajni/jni/corefunctions.cpp index 37dc12d429f..6a250b1dc21 100644 --- a/ReactAndroid/src/main/jni/first-party/yogajni/jni/corefunctions.cpp +++ b/ReactAndroid/src/main/jni/first-party/yogajni/jni/corefunctions.cpp @@ -62,12 +62,16 @@ void logErrorMessageAndDie(const char* message) { } void assertNoPendingJniException(JNIEnv* env) { - // This method cannot call any other method of the library, since other - // methods of the library use it to check for exceptions too - if (env->ExceptionCheck()) { - env->ExceptionDescribe(); - logErrorMessageAndDie("Aborting due to pending Java exception in JNI"); + if (env->ExceptionCheck() == JNI_FALSE) { + return; } + + auto throwable = env->ExceptionOccurred(); + if (!throwable) { + logErrorMessageAndDie("Unable to get pending JNI exception."); + } + env->ExceptionClear(); + throw throwable; } } // namespace vanillajni