HarmonyOS TurboModules使用问题

一.参照demo配置了app项目后,app编译报错:

1 ERROR: ArkTS:ERROR File: /Users/a1234/Documents/xiaopu/ShopDiary/harmony-shopdairy/entry/src/main/ets/RNPackagesFactory.ts:34:42 Importing ArkTS files in JS and TS files is forbidden.
  • 1.

二.rn侧没有生成cpp侧的胶水代码:在rn中也使用了。

SampleTurboModule.registerFunction(value => {
  console.log('value', value)
})
  • 1.
  • 2.
  • 3.

这个方法,但是ohpm run codegen的时候没有生成cpp层的胶水代码。

HarmonyOS
2024-12-25 09:42:58
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
FengTianYa

编译报错是因为在RNPackagesFactory.ts文件中引入了ArkTS文件。可以手动生成Codegen代码,参考指导文件中的自定义TurboModule。

示例参考:

NativeSampleTurboModuleSpecJSI创建名为SampleTurboModuleSpec.h的声明文件,导出NativeSampleTurboModuleSpecJSI:

#include <ReactCommon/TurboModule.h>
#include "RNOH/ArkTSTurboModule.h"
namespace rnoh {
  class JSI_EXPORT NativeSampleTurboModuleSpecJSI : public ArkTSTurboModule {
    public:
      NativeSampleTurboModuleSpecJSI(const ArkTSTurboModule::Context ctx, const
    std::string name);
  };
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

SampleTurboModuleSpec.cpp实现,注意MethodMetadata的第⼀个参数是⾃定义⽅法的参数个数:

#include "SampleTurboModuleSpec.h"
using namespace rnoh;
using namespace facebook;
static jsi::Value
__hostFunction_NativeSampleTurboCxxModuleSpecJSI_pushStringToHarmony(jsi::Runtime
  &rt, react::TurboModule &turboModule, const jsi::Value *args, size_t count) {
  return jsi::Value(static_cast<ArkTSTurboModule &>(turboModule).call(rt,
    "pushStringToHarmony", args, count));
}
NativeSampleTurboModuleSpecJSI::NativeSampleTurboModuleSpecJSI(const
ArkTSTurboModule::Context ctx,
const std::string name): ArkTSTurboModule(ctx, name) {
  methodMap_["pushStringToHarmony"] = MethodMetadata{2,__hostFunction_NativeSampleTurboCxxModuleSpecJSI_pushStringToHarmony};
} 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

SampleTurboModulePackage.h提供createTurboModuleFactoryDelegate:

#include "RNOH/Package.h"
namespace rnoh {
  class SampleTurboModulePackage : public Package {
    public:
      SampleTurboModulePackage(Package::Context ctx) : Package(ctx) {}
    std::unique_ptr<TurboModuleFactoryDelegate>
    createTurboModuleFactoryDelegate() override;
  };
} // namespace rnoh
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

SampleTurboModulePackage.cpp实现C++层的createTurboModuleFactoryDelegate的 createTurboModule⽅法,在createTurboModule⽅法中需要引⽤NativeSampleTurboModuleSpecJSI:

#include "./TurboModules/SampleTurboModuleSpec.h"
using namespace rnoh;
using namespace facebook;
class SampleTurboModuleFactoryDelegate : public TurboModuleFactoryDelegate {
  public:
    SharedTurboModule createTurboModule(Context ctx, const std::string &name)
  const override {
    if (name == "SampleTurboModule") {
      return std::make_shared<NativeSampleTurboModuleSpecJSI>(ctx, name);
    }
    return nullptr;
  };
};
std::unique_ptr<TurboModuleFactoryDelegate>
  SampleTurboModulePackage::createTurboModuleFactoryDelegate() {
  return std::make_unique<SampleTurboModuleFactoryDelegate>();
} 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

PackageProvider.cpp在PackageProvider的getPackages⽅法实现中添加SampleTurboModulePackage:

#include "RNOH/PackageProvider.h"
#include "SampleTurboModulePackage.h"
using namespace rnoh;
std::vector<std::shared_ptr<Package>>
  PackageProvider::getPackages(Package::Context ctx) {
  return {
    + std::make_shared<SampleTurboModulePackage>(ctx),
  };
} 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

CMakeLists.txt在CMakeLists中导入C++文件链接:

add_library(rnoh_app SHARED
"./PackageProvider.cpp"
  + "./TurboModules/SampleTurboModuleSpec.cpp"
  + "./SampleTurboModulePackage.cpp"
"${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp"
) 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

Codegen的配置主要是在应用的package.json中添加 harmony.codegenConfig字段,其中specPaths定义了文件的入口:

// package.json
{
  "harmony": {
  "codegenConfig": {
    "specPaths": [
    "./src"
    ]
  }
}
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
分享
微博
QQ
微信
回复
2024-12-25 12:07:32
相关问题
HarmonyOS RichEditor 使用问题
1190浏览 • 1回复 待解决
HarmonyOS AudioCapturer使用问题
609浏览 • 1回复 待解决
HarmonyOS RSA使用问题
474浏览 • 1回复 待解决
HarmonyOS Navigation 使用问题
1177浏览 • 1回复 待解决
HarmonyOS CustomDialogController使用问题
518浏览 • 1回复 待解决
HarmonyOS resourceManager使用问题
1298浏览 • 1回复 待解决
HarmonyOS Worker使用问题
658浏览 • 1回复 待解决
HarmonyOS地图使用问题
977浏览 • 1回复 待解决
HarmonyOS soundpool使用问题
1160浏览 • 1回复 待解决
HarmonyOS @Link使用问题
667浏览 • 1回复 待解决
HarmonyOS websocket使用问题
1036浏览 • 1回复 待解决
HarmonyOS eventHub使用问题
906浏览 • 1回复 待解决
HarmonyOS SideBarContainer使用问题
656浏览 • 1回复 待解决
HarmonyOS lottie使用问题
1039浏览 • 1回复 待解决
HarmonyOS Navigation使用问题
1262浏览 • 1回复 待解决
HarmonyOS Imageknife使用问题
732浏览 • 1回复 待解决
HarmonyOS ProtoBuffer使用问题
973浏览 • 1回复 待解决
HarmonyOS RichEditor使用问题
572浏览 • 1回复 待解决
HarmonyOS textpicker使用问题
727浏览 • 1回复 待解决
HarmonyOS Slide使用问题
912浏览 • 1回复 待解决
HarmonyOS filePreview使用问题
1034浏览 • 1回复 待解决
HarmonyOS Slider使用问题
742浏览 • 1回复 待解决
HarmonyOS @Track使用问题
541浏览 • 1回复 待解决
HarmonyOS onAreaChange使用问题
1499浏览 • 1回复 待解决
HarmonyOS jsbridge使用问题
722浏览 • 1回复 待解决