C-API版本XComponent接入

C-API版XComponent创建详解

C-API 版本使用XComponent总共分成了两个步骤:

createSurface的时候主要做了以下的操作:

void RNInstanceCAPI::createSurface(facebook::react::Tag surfaceId, std::string const& moduleName) {
  m_surfaceById.emplace(
    surfaceId,
    XComponentSurface(
      // ···
    surfaceId,
    moduleName)
  );
}

XComponentSurface::XComponentSurface(
//···
SurfaceId surfaceId,
std::string const& appKey)
: 
  //···
  m_nativeXComponent(nullptr),
  m_rootView(nullptr),
  m_surfaceHandler(SurfaceHandler(appKey, surfaceId)) {
    m_scheduler->registerSurface(m_surfaceHandler);
    m_rootView = componentInstanceFactory->create(
      surfaceId, facebook::react::RootShadowNode::Handle(), "RootView");
    m_componentInstanceRegistry->insert(m_rootView);
    m_touchEventHandler = std::make_unique<SurfaceTouchEventHandler>(m_rootView);
  }

startSurface的时候主要做了以下的操作:

  • id:组件的唯一标识,又由InstanceID和SurfaceID共同组成,记录了此XComponent属于哪一个Instance与Surface;
  • type:node,标识该XComponent是一个占位组件,组件的实现都在C-API侧;
  • libraryname:表示C-API组件在哪个so库中实现,并加载该so库,自动调用该so中定义的Init函数。当前React Native for OpenHarmony默认的so名字rnoh_app。
XComponent({
    id: this.ctx.rnInstance.getId() + "_" + this.surfaceHandle.getTag(),
    type: "node",
    libraryname: 'rnoh_app'
})
if (OH_NativeXComponent_GetXComponentId(nativeXComponent, idStr, &idSize) !=
  OH_NATIVEXCOMPONENT_RESULT_SUCCESS) {
    ···
}
std::string xcomponentStr(idStr);
std::stringstream ss(xcomponentStr);
std::string instanceId;
std::getline(ss, instanceId, '_');
std::string surfaceId;
std::getline(ss, surfaceId, '_');

OH_NativeXComponent_AttachNativeRootNode(
    nativeXComponent,
    rootView.getLocalRootArkUINode().getArkUINodeHandle());

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值