diff --git a/.github/workflows/example-android-build-check.yml b/.github/workflows/example-android-build-check.yml index ff190292ab1f..4896439e3f6e 100644 --- a/.github/workflows/example-android-build-check.yml +++ b/.github/workflows/example-android-build-check.yml @@ -43,6 +43,7 @@ jobs: env: WORKING_DIRECTORY: apps/fabric-example COMMON_APP_DIR: apps/common-app + REANIMATED_DIR: packages/react-native-reanimated concurrency: group: android-${{ github.ref }}-${{ inputs.use-external-worklets }} cancel-in-progress: true @@ -59,6 +60,14 @@ jobs: # TODO: Add caching for node_modules and artifacts that will work with monorepo setup. - name: Install monorepo node dependencies run: yarn install --immutable + - name: Build Reanimated package + working-directory: ${{ env.REANIMATED_DIR }} + run: yarn build + + - name: Use external worklets + if: ${{ inputs.use-external-worklets == 'true' }} + working-directory: ${{ env.COMMON_APP_DIR }} + run: yarn add react-native-worklets@workspace:"*" - name: Use external worklets if: ${{ inputs.use-external-worklets == 'true' }} diff --git a/.github/workflows/example-ios-build-check.yml b/.github/workflows/example-ios-build-check.yml index 8fd9829d59e5..a262953d3a0a 100644 --- a/.github/workflows/example-ios-build-check.yml +++ b/.github/workflows/example-ios-build-check.yml @@ -47,6 +47,7 @@ jobs: env: WORKING_DIRECTORY: apps/fabric-example COMMON_APP_DIR: apps/common-app + REANIMATED_DIR: packages/react-native-reanimated concurrency: group: ios-${{ github.ref }}-${{ inputs.use-external-worklets }} cancel-in-progress: true @@ -60,6 +61,9 @@ jobs: - name: Install monorepo node dependencies run: yarn install --immutable + - name: Build Reanimated package + working-directory: ${{ env.REANIMATED_DIR }} + run: yarn build - name: Use external worklets if: ${{ inputs.use-external-worklets == 'true' }} diff --git a/.github/workflows/example-macos-build-check.yml b/.github/workflows/example-macos-build-check.yml index df1bb910ee7b..f21c2b32499b 100644 --- a/.github/workflows/example-macos-build-check.yml +++ b/.github/workflows/example-macos-build-check.yml @@ -49,6 +49,7 @@ jobs: env: WORKING_DIRECTORY: apps/macos-example COMMON_APP_DIR: apps/common-app + REANIMATED_DIR: packages/react-native-reanimated concurrency: group: macos-${{ github.ref }}-${{ inputs.use-external-worklets }} cancel-in-progress: true @@ -63,6 +64,14 @@ jobs: # TODO: Add caching for node_modules and artifacts that will work with monorepo setup. - name: Install monorepo node dependencies run: yarn install --immutable + - name: Build Reanimated package + working-directory: ${{ env.REANIMATED_DIR }} + run: yarn build + + - name: Use external worklets + if: ${{ inputs.use-external-worklets == 'true' }} + working-directory: ${{ env.COMMON_APP_DIR }} + run: yarn add react-native-worklets@workspace:"*" - name: Use external worklets if: ${{ inputs.use-external-worklets == 'true' }} diff --git a/.github/workflows/example-tvos-build-check.yml b/.github/workflows/example-tvos-build-check.yml index e3e0323cb483..3e2e42082b6c 100644 --- a/.github/workflows/example-tvos-build-check.yml +++ b/.github/workflows/example-tvos-build-check.yml @@ -43,6 +43,7 @@ jobs: env: WORKING_DIRECTORY: apps/tvos-example COMMON_APP_DIR: apps/common-app + REANIMATED_DIR: packages/react-native-reanimated concurrency: group: tvos-${{ github.ref }}-${{ inputs.use-external-worklets }} cancel-in-progress: true @@ -56,14 +57,14 @@ jobs: - name: Install monorepo node dependencies run: yarn install --immutable - # TODO: Add caching for node_modules and artifacts that will work with monorepo setup. - - name: Install Reanimated node_modules - working-directory: packages/react-native-reanimated - run: yarn install --immutable + - name: Build Reanimated package + working-directory: ${{ env.REANIMATED_DIR }} + run: yarn build - - name: Install app node_modules - working-directory: ${{ env.WORKING_DIRECTORY }} - run: yarn install --immutable + - name: Use external worklets + if: ${{ inputs.use-external-worklets == 'true' }} + working-directory: ${{ env.COMMON_APP_DIR }} + run: yarn add react-native-worklets@workspace:"*" - name: Use external worklets if: ${{ inputs.use-external-worklets == 'true' }} diff --git a/.github/workflows/reanimated-android-validation.yml b/.github/workflows/reanimated-android-validation.yml index ca1e55c4b50b..acd9875d296a 100644 --- a/.github/workflows/reanimated-android-validation.yml +++ b/.github/workflows/reanimated-android-validation.yml @@ -34,6 +34,8 @@ jobs: concurrency: group: validate-java-${{ github.ref }} cancel-in-progress: true + env: + REANIMATED_DIR: packages/react-native-reanimated steps: - name: checkout uses: actions/checkout@v4 @@ -62,7 +64,10 @@ jobs: - name: Install monorepo node dependencies run: yarn install --immutable + - name: Build Reanimated package + working-directory: ${{ env.REANIMATED_DIR }} + run: yarn build - name: Lint Android - working-directory: packages/react-native-reanimated + working-directory: ${{ env.REANIMATED_DIR }} run: yarn lint:android diff --git a/.github/workflows/reanimated-apple-validation.yml b/.github/workflows/reanimated-apple-validation.yml index b94907d6ceb6..869a979c7f9a 100644 --- a/.github/workflows/reanimated-apple-validation.yml +++ b/.github/workflows/reanimated-apple-validation.yml @@ -29,13 +29,18 @@ on: jobs: check: if: github.repository == 'software-mansion/react-native-reanimated' + env: + REANIMATED_DIR: packages/react-native-reanimated runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install monorepo node dependencies run: yarn install --immutable + - name: Build Reanimated package + working-directory: ${{ env.REANIMATED_DIR }} + run: yarn build - name: Lint apple - working-directory: packages/react-native-reanimated + working-directory: ${{ env.REANIMATED_DIR }} run: yarn lint:apple diff --git a/.github/workflows/reanimated-common-validation.yml b/.github/workflows/reanimated-common-validation.yml index 25c4063f4487..38b0d894651b 100644 --- a/.github/workflows/reanimated-common-validation.yml +++ b/.github/workflows/reanimated-common-validation.yml @@ -28,7 +28,8 @@ jobs: strategy: matrix: python-version: [3.13] - + env: + REANIMATED_DIR: packages/react-native-reanimated steps: - uses: actions/checkout@v4 @@ -42,11 +43,15 @@ jobs: pip install cpplint==1.6.1 - name: Install monorepo node dependencies run: yarn install --immutable + - name: Build Reanimated + working-directory: ${{ env.REANIMATED_DIR }} + run: yarn build - name: Lint Common - working-directory: packages/react-native-reanimated + working-directory: ${{ env.REANIMATED_DIR }} run: yarn lint:common - name: Disallow DEBUG macros + working-directory: ${{ env.REANIMATED_DIR }} run: | - ! egrep -r '(#if DEBUG|#ifdef DEBUG)' packages/react-native-reanimated/Common/cpp/ packages/react-native-reanimated/apple/ packages/react-native-reanimated/android/src/main/cpp/ + ! egrep -r '(#if DEBUG|#ifdef DEBUG)' Common/cpp/ apple/ android/src/main/cpp/ diff --git a/packages/react-native-reanimated/.gitignore b/packages/react-native-reanimated/.gitignore index fb2d9a6b12aa..9e966e6e2098 100644 --- a/packages/react-native-reanimated/.gitignore +++ b/packages/react-native-reanimated/.gitignore @@ -71,3 +71,9 @@ plugin/types # library bundle *.tgz + +# Worklets code (duplicated) +apple/worklets +Common/cpp/worklets +android/src/worklets +android/src/main/cpp/worklets diff --git a/packages/react-native-reanimated/Common/cpp/reanimated/RuntimeDecorators/RNRuntimeDecorator.cpp b/packages/react-native-reanimated/Common/cpp/reanimated/RuntimeDecorators/RNRuntimeDecorator.cpp index 59ff85f65058..a20b0f5dcbf1 100644 --- a/packages/react-native-reanimated/Common/cpp/reanimated/RuntimeDecorators/RNRuntimeDecorator.cpp +++ b/packages/react-native-reanimated/Common/cpp/reanimated/RuntimeDecorators/RNRuntimeDecorator.cpp @@ -1,5 +1,5 @@ #include -#include +#include namespace reanimated { diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/ReanimatedVersion.cpp b/packages/react-native-reanimated/Common/cpp/reanimated/Tools/ReanimatedVersion.cpp similarity index 94% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/ReanimatedVersion.cpp rename to packages/react-native-reanimated/Common/cpp/reanimated/Tools/ReanimatedVersion.cpp index 0f982afebca6..9d86d84b68ce 100644 --- a/packages/react-native-reanimated/Common/cpp/worklets/Tools/ReanimatedVersion.cpp +++ b/packages/react-native-reanimated/Common/cpp/reanimated/Tools/ReanimatedVersion.cpp @@ -1,5 +1,5 @@ +#include #include -#include #include #include @@ -13,7 +13,7 @@ using namespace facebook; -namespace worklets { +namespace reanimated { std::string getReanimatedCppVersion() { return std::string(REANIMATED_VERSION_STRING); @@ -54,7 +54,7 @@ bool matchVersion(const std::string &version1, const std::string &version2) { void checkJSVersion( jsi::Runtime &rnRuntime, - const std::shared_ptr &jsLogger) { + const std::shared_ptr &jsLogger) { auto cppVersion = getReanimatedCppVersion(); auto maybeJSVersion = @@ -92,4 +92,4 @@ bool matchVersion(const std::string &version1, const std::string &version2) { } #endif // NDEBUG -}; // namespace worklets +}; // namespace reanimated diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/ReanimatedVersion.h b/packages/react-native-reanimated/Common/cpp/reanimated/Tools/ReanimatedVersion.h similarity index 67% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/ReanimatedVersion.h rename to packages/react-native-reanimated/Common/cpp/reanimated/Tools/ReanimatedVersion.h index 80dfa75971e8..07f63a62e2cb 100644 --- a/packages/react-native-reanimated/Common/cpp/worklets/Tools/ReanimatedVersion.h +++ b/packages/react-native-reanimated/Common/cpp/reanimated/Tools/ReanimatedVersion.h @@ -9,11 +9,13 @@ using namespace facebook; -namespace worklets { +namespace reanimated { std::string getReanimatedCppVersion(); void injectReanimatedCppVersion(jsi::Runtime &); bool matchVersion(const std::string &, const std::string &); -void checkJSVersion(jsi::Runtime &, const std::shared_ptr &); +void checkJSVersion( + jsi::Runtime &, + const std::shared_ptr &); -}; // namespace worklets +}; // namespace reanimated diff --git a/packages/react-native-reanimated/RNReanimated.podspec b/packages/react-native-reanimated/RNReanimated.podspec index 9d2832d2f1d1..fc5e59cd9118 100644 --- a/packages/react-native-reanimated/RNReanimated.podspec +++ b/packages/react-native-reanimated/RNReanimated.podspec @@ -77,11 +77,9 @@ Pod::Spec.new do |s| s.platforms = { :ios => ios_min_version, :tvos => "9.0", :osx => "10.14", :visionos => "1.0" } s.source = { :git => "https://github.com/software-mansion/react-native-reanimated.git", :tag => "#{s.version}" } - # TODO: Uncomment me when dynamic worklets linking is ready - # if File.directory?(File.join(__dir__, "../react-native-worklets")) - # # This condition is really naïve... - # s.dependency "RNWorklets" - # else + if $config[:has_external_worklets] + s.dependency "RNWorklets" + else s.subspec "worklets" do |ss| ss.source_files = "Common/cpp/worklets/**/*.{cpp,h}" ss.header_dir = "worklets" @@ -94,7 +92,7 @@ Pod::Spec.new do |s| sss.source_files = "apple/worklets/**/*.{mm,h,m}" sss.header_dir = "worklets" sss.header_mappings_dir = "apple/worklets" - # end + end end end diff --git a/packages/react-native-reanimated/android/build.gradle b/packages/react-native-reanimated/android/build.gradle index dd3d483c41cb..c33c8434e324 100644 --- a/packages/react-native-reanimated/android/build.gradle +++ b/packages/react-native-reanimated/android/build.gradle @@ -141,9 +141,7 @@ def thirdPartyNdkDir = new File("$buildDir/third-party-ndk") def reactNativeThirdParty = new File("$reactNativeRootDir/ReactAndroid/src/main/jni/third-party") def reactNativeAndroidDownloadDir = new File("$reactNativeRootDir/ReactAndroid/build/downloads") -// TODO: Uncomment me when when dynamic worklets linking is ready -// def hasExternalWorklets = rootProject.subprojects.find { it.name == 'react-native-worklets' } != null -def hasExternalWorklets = false +def hasExternalWorklets = rootProject.subprojects.find { it.name == 'react-native-worklets' } != null def workletsPrefabHeadersDir = project.file("$buildDir/prefab-headers/worklets") def reanimatedPrefabHeadersDir = project.file("$buildDir/prefab-headers/reanimated") @@ -260,7 +258,11 @@ android { "-DREANIMATED_VERSION=${REANIMATED_VERSION}", "-DHAS_EXTERNAL_WORKLETS=${hasExternalWorklets}" abiFilters (*reactNativeArchitectures()) - targets("reanimated", "worklets") + if(hasExternalWorklets){ + targets("reanimated") + } else { + targets("reanimated", "worklets") + } } } @@ -343,7 +345,7 @@ android { sourceSets.main { java { if(hasExternalWorklets){ - // Nothing for now. + srcDirs += "src/externalWorklets/with" } else { srcDirs += "src/worklets/main" srcDirs += "src/externalWorklets/without" diff --git a/packages/react-native-reanimated/android/src/externalWorklets/with/com/swmansion/reanimated/ReanimatedPackage.java b/packages/react-native-reanimated/android/src/externalWorklets/with/com/swmansion/reanimated/ReanimatedPackage.java new file mode 100644 index 000000000000..e7b5d32ef4f8 --- /dev/null +++ b/packages/react-native-reanimated/android/src/externalWorklets/with/com/swmansion/reanimated/ReanimatedPackage.java @@ -0,0 +1,97 @@ +package com.swmansion.reanimated; + +import static com.facebook.react.bridge.ReactMarkerConstants.CREATE_UI_MANAGER_MODULE_END; +import static com.facebook.react.bridge.ReactMarkerConstants.CREATE_UI_MANAGER_MODULE_START; + +import androidx.annotation.NonNull; +import com.facebook.react.BaseReactPackage; +import com.facebook.react.ReactApplication; +import com.facebook.react.ReactInstanceManager; +import com.facebook.react.ReactPackage; +import com.facebook.react.bridge.NativeModule; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactMarker; +import com.facebook.react.module.annotations.ReactModule; +import com.facebook.react.module.annotations.ReactModuleList; +import com.facebook.react.module.model.ReactModuleInfo; +import com.facebook.react.module.model.ReactModuleInfoProvider; +import com.facebook.react.uimanager.ReanimatedUIManager; +import com.facebook.react.uimanager.UIManagerModule; +import com.facebook.react.uimanager.ViewManager; +import com.facebook.systrace.Systrace; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@ReactModuleList( + nativeModules = { + ReanimatedModule.class, + ReanimatedUIManager.class, + }) +public class ReanimatedPackage extends BaseReactPackage implements ReactPackage { + @Override + public NativeModule getModule( + @NonNull String name, @NonNull ReactApplicationContext reactContext) { + return switch (name) { + case ReanimatedModule.NAME -> new ReanimatedModule(reactContext); + case ReanimatedUIManager.NAME -> createUIManager(reactContext); + default -> null; + }; + } + + @Override + public ReactModuleInfoProvider getReactModuleInfoProvider() { + Class[] moduleList = + new Class[] { + ReanimatedModule.class, ReanimatedUIManager.class, + }; + + final Map reactModuleInfoMap = new HashMap<>(); + for (Class moduleClass : moduleList) { + ReactModule reactModule = + Objects.requireNonNull(moduleClass.getAnnotation(ReactModule.class)); + + reactModuleInfoMap.put( + reactModule.name(), + new ReactModuleInfo( + reactModule.name(), + moduleClass.getName(), + true, // override UIManagerModule + reactModule.needsEagerInit(), + reactModule.isCxxModule(), + BuildConfig.IS_NEW_ARCHITECTURE_ENABLED)); + } + + return () -> reactModuleInfoMap; + } + + private UIManagerModule createUIManager(final ReactApplicationContext reactContext) { + ReactMarker.logMarker(CREATE_UI_MANAGER_MODULE_START); + Systrace.beginSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, "createUIManagerModule"); + final ReactInstanceManager reactInstanceManager = getReactInstanceManager(reactContext); + List viewManagers = reactInstanceManager.getOrCreateViewManagers(reactContext); + int minTimeLeftInFrameForNonBatchedOperationMs = -1; + try { + return ReanimatedUIManagerFactory.create( + reactContext, viewManagers, minTimeLeftInFrameForNonBatchedOperationMs); + } finally { + Systrace.endSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE); + ReactMarker.logMarker(CREATE_UI_MANAGER_MODULE_END); + } + } + + /** + * Get the {@link ReactInstanceManager} used by this app. By default, assumes {@link + * ReactApplicationContext#getApplicationContext()} is an instance of {@link ReactApplication} and + * calls {@link ReactApplication#getReactNativeHost().getReactInstanceManager()}. Override this + * method if your application class does not implement {@code ReactApplication} or you simply have + * a different mechanism for storing a {@code ReactInstanceManager}, e.g. as a static field + * somewhere. + */ + public ReactInstanceManager getReactInstanceManager(ReactApplicationContext reactContext) { + return ((ReactApplication) reactContext.getApplicationContext()) + .getReactNativeHost() + .getReactInstanceManager(); + } +} diff --git a/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/ReanimatedPackage.java b/packages/react-native-reanimated/android/src/externalWorklets/without/com/swmansion/reanimated/ReanimatedPackage.java similarity index 91% rename from packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/ReanimatedPackage.java rename to packages/react-native-reanimated/android/src/externalWorklets/without/com/swmansion/reanimated/ReanimatedPackage.java index ca640a7c98fa..027961f046a7 100644 --- a/packages/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/ReanimatedPackage.java +++ b/packages/react-native-reanimated/android/src/externalWorklets/without/com/swmansion/reanimated/ReanimatedPackage.java @@ -25,11 +25,9 @@ import java.util.Map; import java.util.Objects; -// `WorkletsModule` should be included from a separate Java package, called `WorkletsPackage`. -// However, it's not possible with the current state of the Gradle Tools provided by -// RNC CLI - all packages besides the first found are ignored. -// Therefore, until we extract `react-native-worklets` to a separate package, -// we will host this module in Reanimated's package. +// `WorkletsPackage` must be registered within `ReanimatedPackage` when +// `react-native-worklets` isn't installed . Extra `...Package` files +// are ignored by React Native tools. @ReactModuleList( nativeModules = { WorkletsModule.class, diff --git a/packages/react-native-reanimated/android/src/externalWorklets/without/com/swmansion/worklets/WorkletsModule.java b/packages/react-native-reanimated/android/src/externalWorklets/without/com/swmansion/worklets/WorkletsModule.java index d5249f8050be..ee1351b63252 100644 --- a/packages/react-native-reanimated/android/src/externalWorklets/without/com/swmansion/worklets/WorkletsModule.java +++ b/packages/react-native-reanimated/android/src/externalWorklets/without/com/swmansion/worklets/WorkletsModule.java @@ -1,5 +1,9 @@ package com.swmansion.worklets; +// In Reanimated the codegen will generate `NativeReaWorkletsModuleSpec`. +// Therefore we must override this file in Reanimated when +// `react-native-worklets` isn't installed. + import androidx.annotation.OptIn; import com.facebook.jni.HybridData; import com.facebook.proguard.annotations.DoNotStrip; @@ -10,14 +14,14 @@ import com.facebook.react.module.annotations.ReactModule; import com.facebook.react.turbomodule.core.CallInvokerHolderImpl; import com.facebook.soloader.SoLoader; -import com.swmansion.reanimated.NativeWorkletsModuleSpec; +import com.swmansion.reanimated.NativeReaWorkletsModuleSpec; import java.util.Objects; /** * @noinspection JavaJniMissingFunction */ @ReactModule(name = WorkletsModule.NAME) -public class WorkletsModule extends NativeWorkletsModuleSpec { +public class WorkletsModule extends NativeReaWorkletsModuleSpec { static { SoLoader.loadLibrary("worklets"); } diff --git a/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.cpp b/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.cpp index 4a860f777414..2967858efd1a 100644 --- a/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.cpp +++ b/packages/react-native-reanimated/android/src/main/cpp/reanimated/android/NativeProxy.cpp @@ -1,10 +1,10 @@ #include #include #include +#include #include #include -#include #include #include #include diff --git a/packages/react-native-reanimated/android/src/main/cpp/worklets/CMakeLists.txt b/packages/react-native-reanimated/android/src/main/cpp/worklets/CMakeLists.txt deleted file mode 100644 index ce128cf1894f..000000000000 --- a/packages/react-native-reanimated/android/src/main/cpp/worklets/CMakeLists.txt +++ /dev/null @@ -1,85 +0,0 @@ -cmake_minimum_required(VERSION 3.8) - -file(GLOB_RECURSE WORKLETS_COMMON_CPP_SOURCES CONFIGURE_DEPENDS - "${COMMON_CPP_DIR}/worklets/*.cpp") -file(GLOB_RECURSE WORKLETS_ANDROID_CPP_SOURCES CONFIGURE_DEPENDS - "${ANDROID_CPP_DIR}/worklets/*.cpp") - -# Consume shared libraries and headers from prefabs -find_package(fbjni REQUIRED CONFIG) -find_package(ReactAndroid REQUIRED CONFIG) - -if(${JS_RUNTIME} STREQUAL "hermes") - find_package(hermes-engine REQUIRED CONFIG) -endif() - -add_library(worklets SHARED ${WORKLETS_COMMON_CPP_SOURCES} - ${WORKLETS_ANDROID_CPP_SOURCES}) - -# includes -target_include_directories(worklets PUBLIC "${COMMON_CPP_DIR}" - "${ANDROID_CPP_DIR}") - -target_include_directories( - worklets - PRIVATE "${REACT_NATIVE_DIR}/ReactCommon" - "${REACT_NATIVE_DIR}/ReactAndroid/src/main/jni/react/turbomodule" - "${REACT_NATIVE_DIR}/ReactCommon/react/nativemodule/core/ReactCommon" - "${REACT_NATIVE_DIR}/ReactCommon/callinvoker" - "${REACT_NATIVE_DIR}/ReactCommon/runtimeexecutor") - -if(${IS_NEW_ARCHITECTURE_ENABLED}) - target_include_directories( - worklets - PRIVATE - "${REACT_NATIVE_DIR}/ReactCommon/yoga" - "${REACT_NATIVE_DIR}/ReactCommon/react/renderer/graphics/platform/cxx") - - if(ReactAndroid_VERSION_MINOR LESS 76) - target_link_libraries( - worklets ReactAndroid::fabricjni ReactAndroid::react_debug - ReactAndroid::react_render_core - ReactAndroid::react_render_componentregistry ReactAndroid::rrc_view) - endif() -endif() - -# build shared lib -set_target_properties(worklets PROPERTIES LINKER_LANGUAGE CXX) - -target_link_libraries(worklets log ReactAndroid::jsi fbjni::fbjni) - -if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76) - target_link_libraries(worklets ReactAndroid::reactnative) -else() - target_link_libraries( - worklets ReactAndroid::react_nativemodule_core ReactAndroid::folly_runtime - ReactAndroid::glog ReactAndroid::reactnativejni) -endif() - -if(${JS_RUNTIME} STREQUAL "hermes") - target_link_libraries(worklets hermes-engine::libhermes) - - if(${HERMES_ENABLE_DEBUGGER}) - if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76) - target_link_libraries(worklets ReactAndroid::hermestooling) - else() - target_link_libraries(worklets ReactAndroid::hermes_executor) - endif() - endif() -elseif(${JS_RUNTIME} STREQUAL "jsc") - if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76) - target_link_libraries(worklets ReactAndroid::jsctooling) - else() - target_link_libraries(worklets ReactAndroid::jscexecutor) - endif() -elseif(${JS_RUNTIME} STREQUAL "v8") - # TODO: Refactor this when adding support for newest V8 - target_include_directories(worklets PRIVATE "${JS_RUNTIME_DIR}/src") - file(GLOB V8_SO_DIR "${JS_RUNTIME_DIR}/android/build/intermediates/\ - library_jni/**/jni/${ANDROID_ABI}") - find_library( - V8EXECUTOR_LIB v8executor - PATHS ${V8_SO_DIR} - NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) - target_link_libraries(worklets ${V8EXECUTOR_LIB}) -endif() diff --git a/packages/react-native-reanimated/package.json b/packages/react-native-reanimated/package.json index 739d4ab30727..93c67385a2ce 100644 --- a/packages/react-native-reanimated/package.json +++ b/packages/react-native-reanimated/package.json @@ -25,7 +25,7 @@ "type:check:plugin": "cd plugin && yarn type:check:src", "type:check:app": "yarn workspace common-app type:check", "type:check:tests:common": "./scripts/test-ts.sh __typetests__/common", - "build": "yarn build:plugin && bob build", + "build": "./scripts/duplicate-worklets-code.sh && yarn build:plugin && bob build", "build:plugin": "cd plugin && yarn build", "circular-dependency-check": "yarn madge --extensions js,jsx,ts,tsx --circular src lib", "use-strict-check": "node ./scripts/validate-use-strict.js", diff --git a/packages/react-native-reanimated/scripts/duplicate-worklets-code.sh b/packages/react-native-reanimated/scripts/duplicate-worklets-code.sh new file mode 100755 index 000000000000..198e46c78eaf --- /dev/null +++ b/packages/react-native-reanimated/scripts/duplicate-worklets-code.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +echo "Duplicating Worklets in Reanimated" + +copy_files_recursively() { + local dest_dir=$1 + local src_dir=$2 + + mkdir -p "$dest_dir" + + for file in "$src_dir"/*; do + if [ -d "$file" ]; then + copy_files_recursively "$dest_dir/$(basename "$file")" "$file" + else + echo " Linking $(basename "$file") in Reanimated" + ln -f "$file" "$dest_dir/$(basename "$file")" + fi + done +} + +# Worklets iOS files +copy_files_recursively "apple/worklets" "../react-native-worklets/apple/worklets" + +# Worklets Android files +# Note that we don't duplicate "android/src/main" +copy_files_recursively "android/src/worklets" "../react-native-worklets/android/src/worklets" + +# Worklets Android-specific cpp files +copy_files_recursively "android/src/main/cpp/worklets" "../react-native-worklets/android/src/main/cpp/worklets" + +# Worklets Common cpp files +copy_files_recursively "Common/cpp/worklets" "../react-native-worklets/Common/cpp/worklets" + +echo "Done duplicating Worklets in Reanimated" diff --git a/packages/react-native-reanimated/scripts/reanimated_utils.rb b/packages/react-native-reanimated/scripts/reanimated_utils.rb index aff6bbb3ffef..3ab7ffd44710 100644 --- a/packages/react-native-reanimated/scripts/reanimated_utils.rb +++ b/packages/react-native-reanimated/scripts/reanimated_utils.rb @@ -6,6 +6,15 @@ def try_to_parse_react_native_package_json(node_modules_dir) return JSON.parse(File.read(react_native_package_json_path)) end +def has_external_worklets() + project_package_json_path = Pod::Config.instance.installation_root + '../package.json' + if !File.exist?(project_package_json_path) + return false + end + project_package_json = JSON.parse(File.read(project_package_json_path)) + return project_package_json['dependencies']['react-native-worklets'] != nil || project_package_json['devDependencies']['react-native-worklets'] != nil +end + def find_config() result = { :is_reanimated_example_app => nil, @@ -15,8 +24,11 @@ def find_config() :react_native_node_modules_dir => nil, :react_native_common_dir => nil, :react_native_reanimated_dir_from_pods_root => nil, + :has_external_worklets => nil } + result[:has_external_worklets] = has_external_worklets() + react_native_node_modules_dir = File.join(File.dirname(`cd "#{Pod::Config.instance.installation_root.to_s}" && node --print "require.resolve('react-native/package.json')"`), '..') react_native_json = try_to_parse_react_native_package_json(react_native_node_modules_dir) diff --git a/packages/react-native-reanimated/src/specs/NativeWorkletsModule.ts b/packages/react-native-reanimated/src/specs/NativeReaWorkletsModule.ts similarity index 100% rename from packages/react-native-reanimated/src/specs/NativeWorkletsModule.ts rename to packages/react-native-reanimated/src/specs/NativeReaWorkletsModule.ts diff --git a/packages/react-native-reanimated/src/specs/index.ts b/packages/react-native-reanimated/src/specs/index.ts index 66b304030fa1..0c193348d99a 100644 --- a/packages/react-native-reanimated/src/specs/index.ts +++ b/packages/react-native-reanimated/src/specs/index.ts @@ -1,6 +1,6 @@ 'use strict'; -import WorkletsTurboModule from './NativeWorkletsModule'; +import WorkletsTurboModule from './NativeReaWorkletsModule'; import ReanimatedTurboModule from './NativeReanimatedModule'; export { WorkletsTurboModule, ReanimatedTurboModule }; diff --git a/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp b/packages/react-native-worklets/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp rename to packages/react-native-worklets/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.cpp diff --git a/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h b/packages/react-native-worklets/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h rename to packages/react-native-worklets/Common/cpp/worklets/NativeModules/WorkletsModuleProxy.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.cpp b/packages/react-native-worklets/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.cpp similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.cpp rename to packages/react-native-worklets/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.cpp diff --git a/packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.h b/packages/react-native-worklets/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.h rename to packages/react-native-worklets/Common/cpp/worklets/NativeModules/WorkletsModuleProxySpec.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Registries/EventHandlerRegistry.cpp b/packages/react-native-worklets/Common/cpp/worklets/Registries/EventHandlerRegistry.cpp similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Registries/EventHandlerRegistry.cpp rename to packages/react-native-worklets/Common/cpp/worklets/Registries/EventHandlerRegistry.cpp diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Registries/EventHandlerRegistry.h b/packages/react-native-worklets/Common/cpp/worklets/Registries/EventHandlerRegistry.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Registries/EventHandlerRegistry.h rename to packages/react-native-worklets/Common/cpp/worklets/Registries/EventHandlerRegistry.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Registries/WorkletRuntimeRegistry.cpp b/packages/react-native-worklets/Common/cpp/worklets/Registries/WorkletRuntimeRegistry.cpp similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Registries/WorkletRuntimeRegistry.cpp rename to packages/react-native-worklets/Common/cpp/worklets/Registries/WorkletRuntimeRegistry.cpp diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Registries/WorkletRuntimeRegistry.h b/packages/react-native-worklets/Common/cpp/worklets/Registries/WorkletRuntimeRegistry.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Registries/WorkletRuntimeRegistry.h rename to packages/react-native-worklets/Common/cpp/worklets/Registries/WorkletRuntimeRegistry.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/SharedItems/Shareables.cpp b/packages/react-native-worklets/Common/cpp/worklets/SharedItems/Shareables.cpp similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/SharedItems/Shareables.cpp rename to packages/react-native-worklets/Common/cpp/worklets/SharedItems/Shareables.cpp diff --git a/packages/react-native-reanimated/Common/cpp/worklets/SharedItems/Shareables.h b/packages/react-native-worklets/Common/cpp/worklets/SharedItems/Shareables.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/SharedItems/Shareables.h rename to packages/react-native-worklets/Common/cpp/worklets/SharedItems/Shareables.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/AsyncQueue.cpp b/packages/react-native-worklets/Common/cpp/worklets/Tools/AsyncQueue.cpp similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/AsyncQueue.cpp rename to packages/react-native-worklets/Common/cpp/worklets/Tools/AsyncQueue.cpp diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/AsyncQueue.h b/packages/react-native-worklets/Common/cpp/worklets/Tools/AsyncQueue.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/AsyncQueue.h rename to packages/react-native-worklets/Common/cpp/worklets/Tools/AsyncQueue.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/Defs.h b/packages/react-native-worklets/Common/cpp/worklets/Tools/Defs.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/Defs.h rename to packages/react-native-worklets/Common/cpp/worklets/Tools/Defs.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/JSISerializer.cpp b/packages/react-native-worklets/Common/cpp/worklets/Tools/JSISerializer.cpp similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/JSISerializer.cpp rename to packages/react-native-worklets/Common/cpp/worklets/Tools/JSISerializer.cpp diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/JSISerializer.h b/packages/react-native-worklets/Common/cpp/worklets/Tools/JSISerializer.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/JSISerializer.h rename to packages/react-native-worklets/Common/cpp/worklets/Tools/JSISerializer.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/JSLogger.cpp b/packages/react-native-worklets/Common/cpp/worklets/Tools/JSLogger.cpp similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/JSLogger.cpp rename to packages/react-native-worklets/Common/cpp/worklets/Tools/JSLogger.cpp diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/JSLogger.h b/packages/react-native-worklets/Common/cpp/worklets/Tools/JSLogger.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/JSLogger.h rename to packages/react-native-worklets/Common/cpp/worklets/Tools/JSLogger.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/JSScheduler.cpp b/packages/react-native-worklets/Common/cpp/worklets/Tools/JSScheduler.cpp similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/JSScheduler.cpp rename to packages/react-native-worklets/Common/cpp/worklets/Tools/JSScheduler.cpp diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/JSScheduler.h b/packages/react-native-worklets/Common/cpp/worklets/Tools/JSScheduler.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/JSScheduler.h rename to packages/react-native-worklets/Common/cpp/worklets/Tools/JSScheduler.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/PlatformLogger.h b/packages/react-native-worklets/Common/cpp/worklets/Tools/PlatformLogger.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/PlatformLogger.h rename to packages/react-native-worklets/Common/cpp/worklets/Tools/PlatformLogger.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/ReanimatedJSIUtils.cpp b/packages/react-native-worklets/Common/cpp/worklets/Tools/ReanimatedJSIUtils.cpp similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/ReanimatedJSIUtils.cpp rename to packages/react-native-worklets/Common/cpp/worklets/Tools/ReanimatedJSIUtils.cpp diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/ReanimatedJSIUtils.h b/packages/react-native-worklets/Common/cpp/worklets/Tools/ReanimatedJSIUtils.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/ReanimatedJSIUtils.h rename to packages/react-native-worklets/Common/cpp/worklets/Tools/ReanimatedJSIUtils.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/SingleInstanceChecker.h b/packages/react-native-worklets/Common/cpp/worklets/Tools/SingleInstanceChecker.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/SingleInstanceChecker.h rename to packages/react-native-worklets/Common/cpp/worklets/Tools/SingleInstanceChecker.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/ThreadSafeQueue.h b/packages/react-native-worklets/Common/cpp/worklets/Tools/ThreadSafeQueue.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/ThreadSafeQueue.h rename to packages/react-native-worklets/Common/cpp/worklets/Tools/ThreadSafeQueue.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/UIScheduler.cpp b/packages/react-native-worklets/Common/cpp/worklets/Tools/UIScheduler.cpp similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/UIScheduler.cpp rename to packages/react-native-worklets/Common/cpp/worklets/Tools/UIScheduler.cpp diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/UIScheduler.h b/packages/react-native-worklets/Common/cpp/worklets/Tools/UIScheduler.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/UIScheduler.h rename to packages/react-native-worklets/Common/cpp/worklets/Tools/UIScheduler.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/WorkletEventHandler.cpp b/packages/react-native-worklets/Common/cpp/worklets/Tools/WorkletEventHandler.cpp similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/WorkletEventHandler.cpp rename to packages/react-native-worklets/Common/cpp/worklets/Tools/WorkletEventHandler.cpp diff --git a/packages/react-native-reanimated/Common/cpp/worklets/Tools/WorkletEventHandler.h b/packages/react-native-worklets/Common/cpp/worklets/Tools/WorkletEventHandler.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/Tools/WorkletEventHandler.h rename to packages/react-native-worklets/Common/cpp/worklets/Tools/WorkletEventHandler.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.cpp b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.cpp similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.cpp rename to packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.cpp diff --git a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.h b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.h rename to packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RNRuntimeWorkletDecorator.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedHermesRuntime.cpp b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/ReanimatedHermesRuntime.cpp similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedHermesRuntime.cpp rename to packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/ReanimatedHermesRuntime.cpp diff --git a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedHermesRuntime.h b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/ReanimatedHermesRuntime.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedHermesRuntime.h rename to packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/ReanimatedHermesRuntime.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedRuntime.cpp b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/ReanimatedRuntime.cpp similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedRuntime.cpp rename to packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/ReanimatedRuntime.cpp diff --git a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedRuntime.h b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/ReanimatedRuntime.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/ReanimatedRuntime.h rename to packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/ReanimatedRuntime.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/RuntimeInitialization.md b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RuntimeInitialization.md similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/RuntimeInitialization.md rename to packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/RuntimeInitialization.md diff --git a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp rename to packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.cpp diff --git a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.h b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.h rename to packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntime.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeCollector.h b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeCollector.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeCollector.h rename to packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeCollector.h diff --git a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.cpp b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.cpp similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.cpp rename to packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.cpp diff --git a/packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.h b/packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.h similarity index 100% rename from packages/react-native-reanimated/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.h rename to packages/react-native-worklets/Common/cpp/worklets/WorkletRuntime/WorkletRuntimeDecorator.h diff --git a/packages/react-native-worklets/android/CMakeLists.txt b/packages/react-native-worklets/android/CMakeLists.txt index 050525a418e0..905f2c5030be 100644 --- a/packages/react-native-worklets/android/CMakeLists.txt +++ b/packages/react-native-worklets/android/CMakeLists.txt @@ -53,5 +53,4 @@ set(BUILD_DIR "${CMAKE_SOURCE_DIR}/build") set(ANDROID_CPP_DIR "${CMAKE_SOURCE_DIR}/src/main/cpp") set(COMMON_CPP_DIR "${CMAKE_SOURCE_DIR}/../Common/cpp") -# TODO: Uncomment me when worklets get some sources -# add_subdirectory("${ANDROID_CPP_DIR}/worklets") +add_subdirectory("${ANDROID_CPP_DIR}/worklets") diff --git a/packages/react-native-worklets/android/build.gradle b/packages/react-native-worklets/android/build.gradle index 4c532e212013..9f42bb82e51a 100644 --- a/packages/react-native-worklets/android/build.gradle +++ b/packages/react-native-worklets/android/build.gradle @@ -251,6 +251,7 @@ android { "-DIS_NEW_ARCHITECTURE_ENABLED=${IS_NEW_ARCHITECTURE_ENABLED}", "-DIS_REANIMATED_EXAMPLE_APP=${isReanimatedExampleApp()}" abiFilters (*reactNativeArchitectures()) + targets("worklets") } } @@ -330,6 +331,17 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + sourceSets { + main { + java { + srcDirs += "src/worklets/main" + + if (!IS_NEW_ARCHITECTURE_ENABLED) { + srcDirs += "src/worklets/paper" + } + } + } + } } def assertMinimalReactNativeVersion = task assertMinimalReactNativeVersionTask { diff --git a/packages/react-native-worklets/android/src/main/cpp/worklets/CMakeLists.txt b/packages/react-native-worklets/android/src/main/cpp/worklets/CMakeLists.txt index d441c5ff11c0..ce128cf1894f 100644 --- a/packages/react-native-worklets/android/src/main/cpp/worklets/CMakeLists.txt +++ b/packages/react-native-worklets/android/src/main/cpp/worklets/CMakeLists.txt @@ -76,7 +76,7 @@ elseif(${JS_RUNTIME} STREQUAL "v8") # TODO: Refactor this when adding support for newest V8 target_include_directories(worklets PRIVATE "${JS_RUNTIME_DIR}/src") file(GLOB V8_SO_DIR "${JS_RUNTIME_DIR}/android/build/intermediates/\ - library_jni/*/jni/${ANDROID_ABI}") + library_jni/**/jni/${ANDROID_ABI}") find_library( V8EXECUTOR_LIB v8executor PATHS ${V8_SO_DIR} diff --git a/packages/react-native-reanimated/android/src/main/cpp/worklets/android/AndroidUIScheduler.cpp b/packages/react-native-worklets/android/src/main/cpp/worklets/android/AndroidUIScheduler.cpp similarity index 100% rename from packages/react-native-reanimated/android/src/main/cpp/worklets/android/AndroidUIScheduler.cpp rename to packages/react-native-worklets/android/src/main/cpp/worklets/android/AndroidUIScheduler.cpp diff --git a/packages/react-native-reanimated/android/src/main/cpp/worklets/android/AndroidUIScheduler.h b/packages/react-native-worklets/android/src/main/cpp/worklets/android/AndroidUIScheduler.h similarity index 100% rename from packages/react-native-reanimated/android/src/main/cpp/worklets/android/AndroidUIScheduler.h rename to packages/react-native-worklets/android/src/main/cpp/worklets/android/AndroidUIScheduler.h diff --git a/packages/react-native-reanimated/android/src/main/cpp/worklets/android/PlatformLogger.cpp b/packages/react-native-worklets/android/src/main/cpp/worklets/android/PlatformLogger.cpp similarity index 100% rename from packages/react-native-reanimated/android/src/main/cpp/worklets/android/PlatformLogger.cpp rename to packages/react-native-worklets/android/src/main/cpp/worklets/android/PlatformLogger.cpp diff --git a/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsModule.cpp b/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.cpp similarity index 100% rename from packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsModule.cpp rename to packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.cpp diff --git a/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsModule.h b/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.h similarity index 100% rename from packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsModule.h rename to packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsModule.h diff --git a/packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsOnLoad.cpp b/packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsOnLoad.cpp similarity index 100% rename from packages/react-native-reanimated/android/src/main/cpp/worklets/android/WorkletsOnLoad.cpp rename to packages/react-native-worklets/android/src/main/cpp/worklets/android/WorkletsOnLoad.cpp diff --git a/packages/react-native-worklets/android/src/main/java/com/swmansion/worklets/DummyWorkletsModule.java b/packages/react-native-worklets/android/src/main/java/com/swmansion/worklets/DummyWorkletsModule.java deleted file mode 100644 index c2c8821ef854..000000000000 --- a/packages/react-native-worklets/android/src/main/java/com/swmansion/worklets/DummyWorkletsModule.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.swmansion.worklets; - -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.module.annotations.ReactModule; - -@ReactModule(name = DummyWorkletsModule.NAME) -public class DummyWorkletsModule extends - NativeDummyWorkletsSpec { - - public DummyWorkletsModule(ReactApplicationContext reactContext) { - super(reactContext); - } - - @Override - public boolean installTurboModule() { - return true; - } -} diff --git a/packages/react-native-worklets/android/src/main/java/com/swmansion/worklets/WorkletsModule.java b/packages/react-native-worklets/android/src/main/java/com/swmansion/worklets/WorkletsModule.java new file mode 100644 index 000000000000..925efe86749f --- /dev/null +++ b/packages/react-native-worklets/android/src/main/java/com/swmansion/worklets/WorkletsModule.java @@ -0,0 +1,80 @@ +package com.swmansion.worklets; + +import androidx.annotation.OptIn; +import com.facebook.jni.HybridData; +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.queue.MessageQueueThread; +import com.facebook.react.common.annotations.FrameworkAPI; +import com.facebook.react.module.annotations.ReactModule; +import com.facebook.react.turbomodule.core.CallInvokerHolderImpl; +import com.facebook.soloader.SoLoader; +import java.util.Objects; + +/** + * @noinspection JavaJniMissingFunction + */ +@ReactModule(name = WorkletsModule.NAME) +public class WorkletsModule extends NativeWorkletsModuleSpec { + static { + SoLoader.loadLibrary("worklets"); + } + + @DoNotStrip + @SuppressWarnings("unused") + private HybridData mHybridData; + + @SuppressWarnings("unused") + protected HybridData getHybridData() { + return mHybridData; + } + + private final WorkletsMessageQueueThread mMessageQueueThread = new WorkletsMessageQueueThread(); + private final AndroidUIScheduler mAndroidUIScheduler; + + public AndroidUIScheduler getAndroidUIScheduler() { + return mAndroidUIScheduler; + } + + @OptIn(markerClass = FrameworkAPI.class) + private native HybridData initHybrid( + long jsContext, + String valueUnpackerCode, + MessageQueueThread messageQueueThread, + CallInvokerHolderImpl jsCallInvokerHolder, + AndroidUIScheduler androidUIScheduler); + + public WorkletsModule(ReactApplicationContext reactContext) { + super(reactContext); + mAndroidUIScheduler = new AndroidUIScheduler(reactContext); + } + + @OptIn(markerClass = FrameworkAPI.class) + @ReactMethod(isBlockingSynchronousMethod = true) + public boolean installTurboModule(String valueUnpackerCode) { + var context = getReactApplicationContext(); + var jsContext = Objects.requireNonNull(context.getJavaScriptContextHolder()).get(); + var jsCallInvokerHolder = JSCallInvokerResolver.getJSCallInvokerHolder(context); + + mHybridData = + initHybrid( + jsContext, + valueUnpackerCode, + mMessageQueueThread, + jsCallInvokerHolder, + mAndroidUIScheduler); + return true; + } + + public void invalidate() { + // We have to destroy extra runtimes when invalidate is called. If we clean + // it up later instead there's a chance the runtime will retain references + // to invalidated memory and will crash on its destruction. + invalidateCpp(); + + mAndroidUIScheduler.deactivate(); + } + + private native void invalidateCpp(); +} diff --git a/packages/react-native-worklets/android/src/main/java/com/swmansion/worklets/WorkletsPackage.java b/packages/react-native-worklets/android/src/main/java/com/swmansion/worklets/WorkletsPackage.java index 23066283cbe7..6f0f992e4a02 100644 --- a/packages/react-native-worklets/android/src/main/java/com/swmansion/worklets/WorkletsPackage.java +++ b/packages/react-native-worklets/android/src/main/java/com/swmansion/worklets/WorkletsPackage.java @@ -16,14 +16,14 @@ @ReactModuleList( nativeModules = { - DummyWorkletsModule.class + WorkletsModule.class }) public class WorkletsPackage extends BaseReactPackage implements ReactPackage { @Override public NativeModule getModule( @NonNull String name, @NonNull ReactApplicationContext reactContext) { return switch (name) { - case DummyWorkletsModule.NAME -> new DummyWorkletsModule(reactContext); + case WorkletsModule.NAME -> new WorkletsModule(reactContext); default -> null; }; } @@ -32,7 +32,7 @@ public NativeModule getModule( public ReactModuleInfoProvider getReactModuleInfoProvider() { Class[] moduleList = new Class[] { - DummyWorkletsModule.class + WorkletsModule.class }; final Map reactModuleInfoMap = new HashMap<>(); diff --git a/packages/react-native-reanimated/android/src/worklets/main/com/swmansion/worklets/AndroidUIScheduler.java b/packages/react-native-worklets/android/src/worklets/main/com/swmansion/worklets/AndroidUIScheduler.java similarity index 100% rename from packages/react-native-reanimated/android/src/worklets/main/com/swmansion/worklets/AndroidUIScheduler.java rename to packages/react-native-worklets/android/src/worklets/main/com/swmansion/worklets/AndroidUIScheduler.java diff --git a/packages/react-native-reanimated/android/src/worklets/main/com/swmansion/worklets/JSCallInvokerResolver.java b/packages/react-native-worklets/android/src/worklets/main/com/swmansion/worklets/JSCallInvokerResolver.java similarity index 100% rename from packages/react-native-reanimated/android/src/worklets/main/com/swmansion/worklets/JSCallInvokerResolver.java rename to packages/react-native-worklets/android/src/worklets/main/com/swmansion/worklets/JSCallInvokerResolver.java diff --git a/packages/react-native-reanimated/android/src/worklets/main/com/swmansion/worklets/WorkletsMessageQueueThread.java b/packages/react-native-worklets/android/src/worklets/main/com/swmansion/worklets/WorkletsMessageQueueThread.java similarity index 100% rename from packages/react-native-reanimated/android/src/worklets/main/com/swmansion/worklets/WorkletsMessageQueueThread.java rename to packages/react-native-worklets/android/src/worklets/main/com/swmansion/worklets/WorkletsMessageQueueThread.java diff --git a/packages/react-native-reanimated/android/src/worklets/main/com/swmansion/worklets/WorkletsMessageQueueThreadBase.java b/packages/react-native-worklets/android/src/worklets/main/com/swmansion/worklets/WorkletsMessageQueueThreadBase.java similarity index 100% rename from packages/react-native-reanimated/android/src/worklets/main/com/swmansion/worklets/WorkletsMessageQueueThreadBase.java rename to packages/react-native-worklets/android/src/worklets/main/com/swmansion/worklets/WorkletsMessageQueueThreadBase.java diff --git a/packages/react-native-worklets/android/src/worklets/paper/com/swmansion/worklets/NativeWorkletsModuleSpec.java b/packages/react-native-worklets/android/src/worklets/paper/com/swmansion/worklets/NativeWorkletsModuleSpec.java new file mode 100644 index 000000000000..fb8be04bbcdf --- /dev/null +++ b/packages/react-native-worklets/android/src/worklets/paper/com/swmansion/worklets/NativeWorkletsModuleSpec.java @@ -0,0 +1,26 @@ +package com.swmansion.worklets; + +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; + +public abstract class NativeWorkletsModuleSpec extends ReactContextBaseJavaModule + implements TurboModule { + public static final String NAME = "WorkletsModule"; + + public NativeWorkletsModuleSpec(ReactApplicationContext reactContext) { + super(reactContext); + } + + @Override + public @Nonnull String getName() { + return NAME; + } + + @ReactMethod(isBlockingSynchronousMethod = true) + @DoNotStrip + public abstract boolean installTurboModule(String valueUnpackerCode); +} diff --git a/packages/react-native-worklets/apple/worklets/apple/DummyWorkletsModule.h b/packages/react-native-worklets/apple/worklets/apple/DummyWorkletsModule.h deleted file mode 100644 index c2a6b079ec76..000000000000 --- a/packages/react-native-worklets/apple/worklets/apple/DummyWorkletsModule.h +++ /dev/null @@ -1,5 +0,0 @@ -#import - -@interface DummyWorkletsModule : NSObject - -@end diff --git a/packages/react-native-worklets/apple/worklets/apple/DummyWorkletsModule.mm b/packages/react-native-worklets/apple/worklets/apple/DummyWorkletsModule.mm deleted file mode 100644 index 2ba55e07e77a..000000000000 --- a/packages/react-native-worklets/apple/worklets/apple/DummyWorkletsModule.mm +++ /dev/null @@ -1,19 +0,0 @@ -#import - -@implementation DummyWorkletsModule{ - std::string valueUnpackerCode_; -} -RCT_EXPORT_MODULE() - -- (std::shared_ptr)getTurboModule : - (const facebook::react::ObjCTurboModule::InitParams &)params -{ - return std::make_shared(params); -} - -RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(installTurboModule) -{ - return @YES; -} - -@end diff --git a/packages/react-native-reanimated/apple/worklets/apple/IOSUIScheduler.h b/packages/react-native-worklets/apple/worklets/apple/IOSUIScheduler.h similarity index 100% rename from packages/react-native-reanimated/apple/worklets/apple/IOSUIScheduler.h rename to packages/react-native-worklets/apple/worklets/apple/IOSUIScheduler.h diff --git a/packages/react-native-reanimated/apple/worklets/apple/IOSUIScheduler.mm b/packages/react-native-worklets/apple/worklets/apple/IOSUIScheduler.mm similarity index 100% rename from packages/react-native-reanimated/apple/worklets/apple/IOSUIScheduler.mm rename to packages/react-native-worklets/apple/worklets/apple/IOSUIScheduler.mm diff --git a/packages/react-native-reanimated/apple/worklets/apple/PlatformLogger.mm b/packages/react-native-worklets/apple/worklets/apple/PlatformLogger.mm similarity index 100% rename from packages/react-native-reanimated/apple/worklets/apple/PlatformLogger.mm rename to packages/react-native-worklets/apple/worklets/apple/PlatformLogger.mm diff --git a/packages/react-native-reanimated/apple/worklets/apple/WorkletsMessageThread.h b/packages/react-native-worklets/apple/worklets/apple/WorkletsMessageThread.h similarity index 100% rename from packages/react-native-reanimated/apple/worklets/apple/WorkletsMessageThread.h rename to packages/react-native-worklets/apple/worklets/apple/WorkletsMessageThread.h diff --git a/packages/react-native-reanimated/apple/worklets/apple/WorkletsMessageThread.mm b/packages/react-native-worklets/apple/worklets/apple/WorkletsMessageThread.mm similarity index 100% rename from packages/react-native-reanimated/apple/worklets/apple/WorkletsMessageThread.mm rename to packages/react-native-worklets/apple/worklets/apple/WorkletsMessageThread.mm diff --git a/packages/react-native-reanimated/apple/worklets/apple/WorkletsModule.h b/packages/react-native-worklets/apple/worklets/apple/WorkletsModule.h similarity index 100% rename from packages/react-native-reanimated/apple/worklets/apple/WorkletsModule.h rename to packages/react-native-worklets/apple/worklets/apple/WorkletsModule.h diff --git a/packages/react-native-reanimated/apple/worklets/apple/WorkletsModule.mm b/packages/react-native-worklets/apple/worklets/apple/WorkletsModule.mm similarity index 100% rename from packages/react-native-reanimated/apple/worklets/apple/WorkletsModule.mm rename to packages/react-native-worklets/apple/worklets/apple/WorkletsModule.mm diff --git a/packages/react-native-worklets/package.json b/packages/react-native-worklets/package.json index 7b84f2f17630..fe84f8eb1adc 100644 --- a/packages/react-native-worklets/package.json +++ b/packages/react-native-worklets/package.json @@ -1,7 +1,7 @@ { "name": "react-native-worklets", "version": "0.0.1", - "description": "🚀", + "description": "The React Native multithreading library", "scripts": { "build": "bob build", "format": "yarn format:js", diff --git a/packages/react-native-worklets/src/index.ts b/packages/react-native-worklets/src/index.ts index ba2a736031df..f0c2f62f3c97 100644 --- a/packages/react-native-worklets/src/index.ts +++ b/packages/react-native-worklets/src/index.ts @@ -1,3 +1,3 @@ 'use strict'; -export { DummyWorkletsTurboModule } from './specs'; +export { WorkletsTurboModule } from './specs'; diff --git a/packages/react-native-worklets/src/specs/NativeDummyWorklets.ts b/packages/react-native-worklets/src/specs/NativeWorkletsModule.ts similarity index 55% rename from packages/react-native-worklets/src/specs/NativeDummyWorklets.ts rename to packages/react-native-worklets/src/specs/NativeWorkletsModule.ts index f59202c88c04..81c6d6906d79 100644 --- a/packages/react-native-worklets/src/specs/NativeDummyWorklets.ts +++ b/packages/react-native-worklets/src/specs/NativeWorkletsModule.ts @@ -3,7 +3,7 @@ import type { TurboModule } from 'react-native'; import { TurboModuleRegistry } from 'react-native'; interface Spec extends TurboModule { - installTurboModule: () => boolean; + installTurboModule: (valueUnpackerCode: string) => boolean; } -export default TurboModuleRegistry.get('DummyWorklets'); +export default TurboModuleRegistry.get('WorkletsModule'); diff --git a/packages/react-native-worklets/src/specs/index.ts b/packages/react-native-worklets/src/specs/index.ts index 5b294afa5105..2ea1fb2d2e60 100644 --- a/packages/react-native-worklets/src/specs/index.ts +++ b/packages/react-native-worklets/src/specs/index.ts @@ -1,5 +1,5 @@ 'use strict'; -import DummyWorkletsTurboModule from './NativeDummyWorklets'; +import WorkletsTurboModule from './NativeWorkletsModule'; -export { DummyWorkletsTurboModule }; +export { WorkletsTurboModule };