HarmonyOS Electron 通用桥接层

本项目提供一套用于 HarmonyOS Electron 与 ArkTS/ETS 通信 的通用桥接层,在不编译c++代码的条件下,使用electron调用原生arkts的方法.
使用前请确保已正常在鸿蒙上运行Electron.
使用前请先参考 OpenHarmony Electron 官方文档完成基础配置:

也就是说,官方文档里的 Electron 调用 ETS 基础链路需要先跑通,本项目是在这个基础上提供一个更通用的桥接封装。


1. 本项目功能

本项目把 Electron 侧和 ArkTS/ETS 侧通信收敛成几个固定接口:

invokeSync(action: string, json: string): string
invokeAsync(action: string, json: string, timeoutMs?: number): Promise<string>
subscribe(action: string, callback: (json: string, action: string) => void): number
unsubscribe(id: number): void

主要能力:

  • Electron 同步调用 ArkTS/ETS
  • Electron 异步调用 ArkTS/ETS
  • ArkTS/ETS 主动向 Electron 推送事件
  • Electron 订阅和取消订阅事件
  • 业务通过 action + JSON 分发,不需要每个接口都重新写一套 Node-API 绑定

简单理解:

底层桥接代码固定,业务只需要自己约定 action 和 JSON 数据格式。


2. 快速入门

本项目会提供已经编译好的产物(lib目录),目前对应 Electron 34

需要将下面三个文件放到鸿蒙工程目录:

addon.node
libaki_jsbind.so
libadaptertest.so

放入路径:

ohos_hap/electron/libs/arm64-v8a/

示例目录结构:

ohos_hap/
  electron/
    libs/
      arm64-v8a/
        addon.node
        libaki_jsbind.so
        libadaptertest.so

放好后,Electron 侧加载 addon.node 即可使用桥接能力。


3. Electron 侧调用示例

3.1 加载桥

const bridge = require('./addon.node')

实际路径根据你的工程放置位置调整。


3.2 同步调用 ArkTS/ETS

const result = bridge.invokeSync(
  'user.getInfo',
  JSON.stringify({ userId: '10001' })
)

console.log('sync result:', result)

3.3 异步调用 ArkTS/ETS

async function main() {
  const result = await bridge.invokeAsync(
    'user.getProfile',
    JSON.stringify({ userId: '10001' }),
    5000
  )

  console.log('async result:', result)
}

main()

3.4 订阅 ArkTS/ETS 事件

const subId = bridge.subscribe('device.status.changed', (json, action) => {
  console.log('event action:', action)
  console.log('event data:', JSON.parse(json))
})

// 不需要时取消订阅
bridge.unsubscribe(subId)

4. 鸿蒙 ArkTS/ETS 侧绑定

鸿蒙侧需要把自己实现的 invokeSyncinvokeAsync 绑定到桥接层。

JSBindingTest.currentContext.JSBind.bindFunction(
  'invokeSync',
  JSBindingTest.invokeSync
)

JSBindingTest.currentContext.JSBind.bindFunction(
  'invokeAsync',
  JSBindingTest.invokeAsync
)

其中:

  • JSBindingTest.invokeSync 由业务自己实现
  • JSBindingTest.invokeAsync 由业务自己实现
  • Electron 侧传过来的 actionjson 会进入这两个函数

5. ArkTS/ETS 同步接口示例

static invokeSync(action: string, json: string): string {
  console.info(`invokeSync action=${action}, json=${json}`)

  switch (action) {
    case 'user.getInfo': {
      const req = JSON.parse(json)

      return JSON.stringify({
        ok: true,
        data: {
          userId: req.userId,
          name: 'Harmony User'
        }
      })
    }

    default:
      return JSON.stringify({
        ok: false,
        code: 'ACTION_NOT_FOUND',
        message: `unknown action: ${action}`
      })
  }
}

Electron 侧调用:

bridge.invokeSync('user.getInfo', JSON.stringify({ userId: '10001' }))

6. ArkTS/ETS 异步接口示例

static invokeAsync(
  action: string,
  json: string,
  callback: (resultJson: string) => void
): void {
  console.info(`invokeAsync action=${action}, json=${json}`)

  switch (action) {
    case 'user.getProfile': {
      const req = JSON.parse(json)

      setTimeout(() => {
        callback(JSON.stringify({
          ok: true,
          data: {
            userId: req.userId,
            nickname: 'Harmony Nickname'
          }
        }))
      }, 100)

      return
    }

    default:
      callback(JSON.stringify({
        ok: false,
        code: 'ACTION_NOT_FOUND',
        message: `unknown action: ${action}`
      }))
  }
}

Electron 侧调用:

const result = await bridge.invokeAsync(
  'user.getProfile',
  JSON.stringify({ userId: '10001' }),
  5000
)

7. ArkTS/ETS 主动发送事件

ArkTS/ETS 侧可以通过 emitEvent 主动向 Electron 推送事件。

JSBindingTest.emitEvent(
  'device.status.changed',
  JSON.stringify({
    online: true,
    time: Date.now()
  })
)

Electron 侧订阅:

const subId = bridge.subscribe('device.status.changed', (json, action) => {
  console.log(action, JSON.parse(json))
})

8. 总结

本项目主要是把 HarmonyOS Electron 与 ArkTS/ETS 的通信简化成:

Electron -> action + JSON -> ArkTS/ETS
ArkTS/ETS -> JSON result -> Electron
ArkTS/ETS -> event + JSON -> Electron

适合需要频繁在 Electron 和 ArkTS/ETS 之间通信的场景。

本文档由AI总结生成,可能部分有误,以源码为准.

仓库地址

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐