HarmonyOS鸿蒙Next中TurboModuleRegistry.getEnforcing(...): RNGestureHandlerModule' could not be found.

HarmonyOS鸿蒙Next中TurboModuleRegistry.getEnforcing(…): RNGestureHandlerModule’ could not be found. 使用"^2.23.2-rc.1"版本的"@react-native-ohos/react-native-gesture-handler"后,为什么还会报错?

cke_520.png

cke_1143.png


更多关于HarmonyOS鸿蒙Next中TurboModuleRegistry.getEnforcing(...): RNGestureHandlerModule' could not be found.的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

【背景知识】 CodeGen是RN中的一项工具,用于简化和自动化桥接代码生成,主动执行生成三方库桥接代码参考CodeGen使用指导

【问题定位】

  • 查看报错提示的TurboModule,三方库是否按照文档引入。
  • 查看是否执行了CodeGen,生成的文件是否放置到src/main/cpp/generated目录下。
  • 查看CMakeLists.txt是否引入生成的cpp文件,PackageProvider.cpp是否引入RNOH/PackageProvider.h、generated/RNOHGeneratedPackage.h、GestureHandlerPackage.h。

【解决方案】 使用CodeGen的三方库,需要在CMakeLists.txt引入生成的cpp文件,PackageProvider.cpp引入RNOH/PackageProvider.h、generated/RNOHGeneratedPackage.h、GestureHandlerPackage.h。 CMakeLists.txt确保引入CodeGen生成的CPP,代码如下:

add_subdirectory("${RNOH_CPP_DIR}" ./rn)
add_subdirectory("${OH_MODULES}/@react-native-ohos/react-native-gesture-handler/src/main/cpp" ./gesture-handler)

file(GLOB GENERATED_CPP_FILES "./generated/*.cpp")
add_library(rnoh_app SHARED
    ${GENERATED_CPP_FILES}
    "./PackageProvider.cpp"
    "${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp"
)
target_link_libraries(rnoh_app PUBLIC rnoh_gesture_handler)

PackageProvider.cpp引入正确的头文件:

#include "RNOH/PackageProvider.h"
#include "generated/RNOHGeneratedPackage.h"
#include "GestureHandlerPackage.h"

using namespace rnoh;

std::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) 
{
    return {
        std::make_shared<RNOHGeneratedPackage>(ctx),
        std::make_shared<GestureHandlerPackage>(ctx)
    };
}

RNPackagesFactory使用:

import { RNPackageContext, RNPackage } from '@rnoh/react-native-openharmony/ts';
import GestureHandlerPackage from '@react-native-ohos/react-native-gesture-handler';

export function createRNPackages(ctx: RNPackageContext): RNPackage[] {
  return [
    new GestureHandlerPackage(ctx),
  ];
}

更多关于HarmonyOS鸿蒙Next中TurboModuleRegistry.getEnforcing(...): RNGestureHandlerModule' could not be found.的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


报错 TurboModuleRegistry.getEnforcing(…): RNGestureHandlerModule’ could not be found 的根本原因是鸿蒙原生端未正确注册或未实现 RNGestureHandlerModule 模块。结合你使用的 @react-native-ohos/react-native-gesture-handler@^2.23.2-rc.1 版本,可能涉及以下具体问题:

  1. 三方库版本兼容性
    • 若鸿蒙项目的 react-native-ohos 主版本与 react-native-gesture-handler 版本不匹配,可能导致自动生成的 Native 模块代码与库代码冲突。
    • 例如:单独使用 codegen 生成的项目可能引用了不同版本的 react-native-oh-tpl-react-native-gesture-handler,导致模块注册失败。
  2. Native 模块注册遗漏
    • RNGestureHandlerModule 需要原生端通过 TurboModule 机制注册,若未在 PackageProvider.cpp 中正确引入 GestureHandlerPackage,或未在 CMakeLists.txt 中添加依赖路径,会触发此错误。
  3. 文件路径或 HAR 包引用错误
    • 未正确引用 react-native-oh-tpl-react-native-gesture-handler 的 .har 文件(如路径错误或文件缺失)。

解决方案

  1. 验证版本一致性
    • 确保项目中所有相关依赖版本严格一致:
      // package.json
      "dependencies": {
        "react-native-ohos": "x.y.z",
        "@react-native-ohos/react-native-gesture-handler": "^2.23.2-rc.1"
      }
      
    • 检查 node_modules/@react-native-ohos/react-native-gesture-handler 路径下的 package.json 是否包含正确的原生模块配置。
  2. 完整配置 Native 端
    • 在 entry/src/main/cpp/PackageProvider.cpp 中添加以下代码:
      #include "rnoh/gesture_handler/GestureHandlerPackage.h" 
      // 确保头文件路径正确
      ...
      auto packages = {
          ...,
          std::make_shared<GestureHandlerPackage>() 
          // 注册手势处理模块
      };
      
    • 在 CMakeLists.txt 中确保包含手势库路径:
      target_link_libraries(entry PUBLIC
          ... 
          react-native-gesture-handler::rnoh_gesture_handler
      )
      
  3. 检查 HAR 包引入
    • 确认项目正确引入了 gesture_handler.har(位于 react-native-oh-tpl-react-native-gesture-handler-*.tgz 中的 package/harmony 目录)。
    • 若通过本地路径引用,需在 oh-package.json 中配置正确的 har 路径
  4. 清理并重新构建
    • 删除 node_modules 和 oh_modules 目录,重新执行 ohpm install
    • 清理原生构建缓存(删除 build 目录)后重新编译。

【问题背景】

  1. 运行环境:基于 HarmonyOS 6 系统与 DevEco Studio 开发工具,开发 React Native(RN)相关应用。
  2. 核心问题:集成版本为 ^2.23.2-rc.1@react-native-ohos/react-native-gesture-handler(手势处理三方库)后,应用触发 TurboModuleRegistry.getEnforcing(...): RNGestureHandlerModule could not be found 报错,即 TurboModule 无法找到该手势库对应的模块。
  3. 关键工具关联:需依赖 RN 的 CodeGen 工具 —— 该工具用于简化 / 自动化三方库桥接代码生成,是解决此 TurboModule 相关问题的核心前提(需确保工具正确执行及生成文件合规)。

【解决方案】

  • “确认 CodeGen 执行有效性 + 关键文件配置” 展开,核心是通过 3 个文件的规范配置,让 TurboModule 能正确识别 react-native-gesture-handler 库:
  1. CMakeLists.txt 配置:引入 CodeGen 生成的 CPP 文件(路径 ./generated/*.cpp),并关联 react-native-gesture-handler 库的 CPP 目录,同时将生成文件、PackageProvider.cpp 等纳入工程编译,确保库文件被正确链接。
  2. PackageProvider.cpp 配置:引入 3 个必要头文件(RNOH/PackageProvider.hgenerated/RNOHGeneratedPackage.hGestureHandlerPackage.h),并在 getPackages 方法中返回 RNOHGeneratedPackageGestureHandlerPackage 实例,让 RN 框架识别该手势库包。
  3. RNPackagesFactory 配置:在 TS 文件中导入 GestureHandlerPackage,并在 createRNPackages 方法中创建该包实例,完成 RN 层面的手势库包注册。

该错误表明RNGestureHandlerModule模块未在TurboModuleRegistry中注册。在HarmonyOS Next中,需确保该模块已通过ArkTS/ETS正确实现并注册到Native模块系统。检查模块是否已使用正确的ArkTS接口声明,并在应用启动时完成注册。

这个错误表明 RNGestureHandlerModule 模块在 TurboModule 注册表中未能正确注册。在 HarmonyOS Next 中使用 @react-native-ohos/react-native-gesture-handler 时,需要确保其原生模块已正确集成。

主要原因及解决步骤:

  1. 检查模块注册:确保在 entry/src/main/cpp/types.cpp 中已正确注册 RNGestureHandlerModule。代码应包含:

    #include "RNOHCorePackage/ComponentBinders/ViewComponentNapiBinder.h"
    #include "react-native-gesture-handler/RNGestureHandlerPackage.h"
    

    并在 getPackages 函数中注册:

    auto packages = rnoh::PackageList{};
    packages.push_back(std::make_shared<RNGestureHandlerPackage>());
    
  2. 验证依赖版本:确认 @react-native-ohos/react-native-gesture-handler 版本与项目其他依赖兼容。可尝试升级到稳定版本(如 ^2.23.2)而非 RC 版本。

  3. 清理并重建

    • 删除 node_modulesoh_modules
    • 重新运行 npm install
    • 清理 HarmonyOS 工程:File > Clean Project 或执行 ./gradlew clean
    • 重新编译部署
  4. 检查配置文件:确认 entry/src/main/resources/rawfile/rnoh_package.json 中包含:

    {
      "name": "react-native-gesture-handler",
      "class": "RNGestureHandlerPackage"
    }
    
  5. 验证 HarmonyOS 模块:确保 oh-package.json 中声明的原生模块路径正确,且 src/main/cpp 下的原生代码已完整实现。

若以上步骤仍无法解决,请检查项目是否完整遵循了 HarmonyOS Next 的 React Native 三方库集成规范。

回到顶部