# electron--arkts **Repository Path**: dejks123/electron--arkts ## Basic Information - **Project Name**: electron--arkts - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-08 - **Last Updated**: 2026-06-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # HarmonyOS Electron 通用桥接层 本项目提供一套用于 **HarmonyOS Electron 与 ArkTS/ETS 通信** 的通用桥接层,在不编译c++代码的条件下,使用electron调用原生arkts的方法. 使用前请确保已正常在鸿蒙上运行Electron. 使用前请先参考 OpenHarmony Electron 官方文档完成基础配置: - 文档地址: - 重点参考: - 第四章:ETS 调用及 HAR 包构建 - 第五章:最终调用 也就是说,官方文档里的 Electron 调用 ETS 基础链路需要先跑通,本项目是在这个基础上提供一个更通用的桥接封装。 --- ## 1. 本项目功能 本项目把 Electron 侧和 ArkTS/ETS 侧通信收敛成几个固定接口: ```ts invokeSync(action: string, json: string): string invokeAsync(action: string, json: string, timeoutMs?: number): Promise 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**。 需要将下面三个文件放到鸿蒙工程目录: ```text addon.node libaki_jsbind.so libadaptertest.so ``` 放入路径: ```text ohos_hap/electron/libs/arm64-v8a/ ``` 示例目录结构: ```text ohos_hap/ electron/ libs/ arm64-v8a/ addon.node libaki_jsbind.so libadaptertest.so ``` 放好后,Electron 侧加载 `addon.node` 即可使用桥接能力。 --- ## 3. Electron 侧调用示例 ### 3.1 加载桥 ```ts const bridge = require('./addon.node') ``` 实际路径根据你的工程放置位置调整。 --- ### 3.2 同步调用 ArkTS/ETS ```ts const result = bridge.invokeSync( 'user.getInfo', JSON.stringify({ userId: '10001' }) ) console.log('sync result:', result) ``` --- ### 3.3 异步调用 ArkTS/ETS ```ts 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 事件 ```ts 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` 绑定到桥接层。 ```ts JSBindingTest.currentContext.JSBind.bindFunction( 'invokeSync', JSBindingTest.invokeSync ) JSBindingTest.currentContext.JSBind.bindFunction( 'invokeAsync', JSBindingTest.invokeAsync ) ``` 其中: - `JSBindingTest.invokeSync` 由业务自己实现 - `JSBindingTest.invokeAsync` 由业务自己实现 - Electron 侧传过来的 `action` 和 `json` 会进入这两个函数 --- ## 5. ArkTS/ETS 同步接口示例 ```ts 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 侧调用: ```ts bridge.invokeSync('user.getInfo', JSON.stringify({ userId: '10001' })) ``` --- ## 6. ArkTS/ETS 异步接口示例 ```ts 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 侧调用: ```ts const result = await bridge.invokeAsync( 'user.getProfile', JSON.stringify({ userId: '10001' }), 5000 ) ``` --- ## 7. ArkTS/ETS 主动发送事件 ArkTS/ETS 侧可以通过 `emitEvent` 主动向 Electron 推送事件。 ```ts JSBindingTest.emitEvent( 'device.status.changed', JSON.stringify({ online: true, time: Date.now() }) ) ``` Electron 侧订阅: ```ts const subId = bridge.subscribe('device.status.changed', (json, action) => { console.log(action, JSON.parse(json)) }) ``` --- ## 8. 总结 本项目主要是把 HarmonyOS Electron 与 ArkTS/ETS 的通信简化成: ```text Electron -> action + JSON -> ArkTS/ETS ArkTS/ETS -> JSON result -> Electron ArkTS/ETS -> event + JSON -> Electron ``` 适合需要频繁在 Electron 和 ArkTS/ETS 之间通信的场景。 本文档由AI总结生成,可能部分有误,以源码为准. [仓库地址]: https://gitee.com/dejks123/electron--arkts.git