diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp index e44913e4fd08e2..513b97ee2de2ed 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp @@ -418,8 +418,11 @@ CatalystInstanceImpl::getNativeCallInvokerHolder() { jni::alias_ref CatalystInstanceImpl::getRuntimeExecutor() { if (!runtimeExecutor_) { - runtimeExecutor_ = jni::make_global( - JRuntimeExecutor::newObjectCxxArgs(instance_->getRuntimeExecutor())); + auto executor = instance_->getRuntimeExecutor(); + if (executor) { + runtimeExecutor_ = + jni::make_global(JRuntimeExecutor::newObjectCxxArgs(executor)); + } } return runtimeExecutor_; } @@ -428,15 +431,16 @@ jni::alias_ref CatalystInstanceImpl::getRuntimeScheduler() { if (!runtimeScheduler_) { auto runtimeExecutor = instance_->getRuntimeExecutor(); - auto runtimeScheduler = std::make_shared(runtimeExecutor); - - runtimeScheduler_ = - jni::make_global(JRuntimeScheduler::newObjectCxxArgs(runtimeScheduler)); - - runtimeExecutor([runtimeScheduler](jsi::Runtime &runtime) { - RuntimeSchedulerBinding::createAndInstallIfNeeded( - runtime, runtimeScheduler); - }); + if (runtimeExecutor) { + auto runtimeScheduler = + std::make_shared(runtimeExecutor); + runtimeScheduler_ = jni::make_global( + JRuntimeScheduler::newObjectCxxArgs(runtimeScheduler)); + runtimeExecutor([scheduler = + std::move(runtimeScheduler)](jsi::Runtime &runtime) { + RuntimeSchedulerBinding::createAndInstallIfNeeded(runtime, scheduler); + }); + } } return runtimeScheduler_; diff --git a/packages/react-native/ReactCommon/cxxreact/CMakeLists.txt b/packages/react-native/ReactCommon/cxxreact/CMakeLists.txt index 2aa8c299dc1c38..d1316d7deaa023 100644 --- a/packages/react-native/ReactCommon/cxxreact/CMakeLists.txt +++ b/packages/react-native/ReactCommon/cxxreact/CMakeLists.txt @@ -27,4 +27,5 @@ target_link_libraries(reactnative jsinspector logger reactperflogger - runtimeexecutor) + runtimeexecutor + react_debug) diff --git a/packages/react-native/ReactCommon/cxxreact/Instance.cpp b/packages/react-native/ReactCommon/cxxreact/Instance.cpp index 71bb1512be2865..310a542963b0cd 100644 --- a/packages/react-native/ReactCommon/cxxreact/Instance.cpp +++ b/packages/react-native/ReactCommon/cxxreact/Instance.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include @@ -212,26 +213,31 @@ std::shared_ptr Instance::getJSCallInvoker() { } RuntimeExecutor Instance::getRuntimeExecutor() { - std::weak_ptr weakNativeToJsBridge = nativeToJsBridge_; + // HACK: RuntimeExecutor is not compatible with non-JSIExecutor, we return + // a null callback, which the caller should handle. + if (!getJavaScriptContext()) { + return nullptr; + } - auto runtimeExecutor = - [weakNativeToJsBridge]( - std::function &&callback) { - if (auto strongNativeToJsBridge = weakNativeToJsBridge.lock()) { - strongNativeToJsBridge->runOnExecutorQueue( - [callback = std::move(callback)](JSExecutor *executor) { - jsi::Runtime *runtime = - (jsi::Runtime *)executor->getJavaScriptContext(); - try { - callback(*runtime); - executor->flush(); - } catch (jsi::JSError &originalError) { - handleJSError(*runtime, originalError, true); - } - }); - } - }; - return runtimeExecutor; + std::weak_ptr weakNativeToJsBridge = nativeToJsBridge_; + return [weakNativeToJsBridge]( + std::function &&callback) { + if (auto strongNativeToJsBridge = weakNativeToJsBridge.lock()) { + strongNativeToJsBridge->runOnExecutorQueue( + [callback = std::move(callback)](JSExecutor *executor) { + // Assumes the underlying executor is a JSIExecutor + jsi::Runtime *runtime = + (jsi::Runtime *)executor->getJavaScriptContext(); + try { + react_native_assert(runtime != nullptr); + callback(*runtime); + executor->flush(); + } catch (jsi::JSError &originalError) { + handleJSError(*runtime, originalError, true); + } + }); + } + }; } std::shared_ptr Instance::getDecoratedNativeCallInvoker( diff --git a/packages/react-native/ReactCommon/cxxreact/React-cxxreact.podspec b/packages/react-native/ReactCommon/cxxreact/React-cxxreact.podspec index 14bbb86e7ad0ac..d455d2b94cde33 100644 --- a/packages/react-native/ReactCommon/cxxreact/React-cxxreact.podspec +++ b/packages/react-native/ReactCommon/cxxreact/React-cxxreact.podspec @@ -33,7 +33,7 @@ Pod::Spec.new do |s| s.source_files = "*.{cpp,h}" s.exclude_files = "SampleCxxModule.*" s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags - s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/RCT-Folly\" \"$(PODS_ROOT)/DoubleConversion\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-runtimeexecutor/React_runtimeexecutor.framework/Headers\"", + s.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/RCT-Folly\" \"$(PODS_ROOT)/DoubleConversion\" \"${PODS_CONFIGURATION_BUILD_DIR}/React-runtimeexecutor/React_runtimeexecutor.framework/Headers\" \"$(PODS_CONFIGURATION_BUILD_DIR)/React-debug/React_debug.framework/Headers\"", "CLANG_CXX_LANGUAGE_STANDARD" => "c++17" } s.header_dir = "cxxreact" @@ -47,6 +47,7 @@ Pod::Spec.new do |s| s.dependency "React-perflogger", version s.dependency "React-jsi", version s.dependency "React-logger", version + s.dependency "React-debug", version if ENV['USE_HERMES'] == nil || ENV['USE_HERMES'] == "1" s.dependency 'hermes-engine'