鸿蒙Electron-Electron调用鸿蒙原生arkts
·
HarmonyOS Electron 通用桥接层
本项目提供一套用于 HarmonyOS Electron 与 ArkTS/ETS 通信 的通用桥接层,在不编译c++代码的条件下,使用electron调用原生arkts的方法.
使用前请确保已正常在鸿蒙上运行Electron.
使用前请先参考 OpenHarmony Electron 官方文档完成基础配置:
- 文档地址:https://gitcode.com/openharmony-sig/electron/blob/master/docs/electron-calling-ets-guide/README.md
- 重点参考:
- 第四章:ETS 调用及 HAR 包构建
- 第五章:最终调用
也就是说,官方文档里的 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 侧绑定
鸿蒙侧需要把自己实现的 invokeSync 和 invokeAsync 绑定到桥接层。
JSBindingTest.currentContext.JSBind.bindFunction(
'invokeSync',
JSBindingTest.invokeSync
)
JSBindingTest.currentContext.JSBind.bindFunction(
'invokeAsync',
JSBindingTest.invokeAsync
)
其中:
JSBindingTest.invokeSync由业务自己实现JSBindingTest.invokeAsync由业务自己实现- Electron 侧传过来的
action和json会进入这两个函数
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总结生成,可能部分有误,以源码为准.
更多推荐




所有评论(0)