diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp index e29be7f9cad..54b7f76572d 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.cpp @@ -35,6 +35,12 @@ FabricMountingManager::FabricMountingManager( jni::global_ref& javaUIManager) : javaUIManager_(javaUIManager) {} +FabricMountingManager::~FabricMountingManager() { + // Manually reset `javaUIManager_` since FabricMountingManager may be retained + // from a GC thread (destroyUnmountedShadowNode) + jni::ThreadScope::WithClassLoader([&]() { javaUIManager_.reset(); }); +} + void FabricMountingManager::onSurfaceStart(SurfaceId surfaceId) { std::lock_guard lock(allocatedViewsMutex_); allocatedViewRegistry_.emplace( @@ -905,7 +911,7 @@ void FabricMountingManager::destroyUnmountedShadowNode( // ThreadScope::WithClassLoader is necessary because // destroyUnmountedShadowNode is being called from a destructor thread - facebook::jni::ThreadScope::WithClassLoader([&]() { + jni::ThreadScope::WithClassLoader([&]() { static auto destroyUnmountedView = JFabricUIManager::javaClassStatic()->getMethod( "destroyUnmountedView"); diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.h b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.h index 61978317ff5..3ae20c2370f 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/FabricMountingManager.h @@ -25,6 +25,7 @@ class FabricMountingManager final { FabricMountingManager( jni::global_ref& javaUIManager); FabricMountingManager(const FabricMountingManager&) = delete; + ~FabricMountingManager(); void onSurfaceStart(SurfaceId surfaceId);