Rust + Tauri调用鸿蒙系统原生API,打通桥接实战经验总结

真不容易啊,网上这方面资料很少,探索尝试了很久终于打通了调用鸿蒙原生API的方法。这有什么用?使用Tauri做跨端APP是个不错的技术方案,可以一次可以跨N端。但是呢肯定避免不了依赖和使用系统的原生API来扩展能力。当前Tauri在android和ios端,官方都有插件支持。但鸿蒙还不支持,有待探索。

目标读者

正在(或即将)把 Tauri 应用往鸿蒙(HarmonyOS)上搬、想调用系统原生能力(相册、分享、通知、剪贴板……)的开发者。

本文是一篇实战记录,不是官方文档复述。所有结论都经过真机验证和源码核实, 证据在文末。踩过的坑都在,能让你少走两天弯路。

更多交流学习,欢迎加入开源鸿蒙PC社区https://harmonypc.csdn.net/

欢迎在PC社区平台申请新建项目https://atomgit.com/OpenHarmonyPCDeveloper

猫哥的博客https://blog.csdn.net/qq8864


在这里插入图片描述

0. 先说结论

Tauri v2 在鸿蒙上调用原生 API,绕不开一件事:让 Rust 代码在"主线程"上执行

不是"最好在主线程",是必须。因为 openharmony-abilityget_main_thread_env() 是一个 thread_local,只有主线程能拿到 Env,而拿到 Env 才能调 ArkTS 侧的函数。

tauri 的同步命令却跑在 IPC 线程——两头对不上,就是看到的 main thread env not ready 的全部原因。

解法(本仓库验证通过):AppHandle::run_on_main_thread + channel,把调用投递到主线程,同步等结果。就这么简单,但想明白这行代码,花了些时间探索。


1. 背景:我们要做什么

应用(习惯树)有一个"里程碑卡片":庆祝动画画一张词句落款卡片,用户点"保存卡片"把它存到相册/下载目录,用户自己能看见。

习惯树开源地址:https://atomgit.com/qq8864/habit-tree

桌面端简单:Rust 写文件到下载目录。鸿蒙端不行——应用沙箱用户看不到,媒体库直写要敏感权限(READ_MEDIA 之类,上架审核麻烦)。

正路是 PhotoViewPicker:系统弹窗让用户选保存位置,免权限,用户确认后返回 uri,写入即可。完美符合需求。

但 PhotoViewPicker 是 ArkTS 的 API(方舟运行时),前端 JS(WebView 引擎)和 Rust 都摸不到。所以要搭一条 Rust → ArkTS 的桥:

前端 JS ──invoke──▶ Rust 命令 ──NAPI──▶ ArkTS 全局函数 ──▶ PhotoViewPicker

这条链,每一步都有坑。逐个说。


2. 桥的骨架:全局分发器

ArkTS 侧(EntryAbility)挂一个全局函数,作为统一入口:

// EntryAbility.ets
interface DispatchPayload {
   
    base64: string; filename: string; }
interface DispatchMsg {
   
    plugin: string; cmd: string; payload: DispatchPayload; }

// onCreate 里:
(globalThis as ESObject).__ohos_dispatch = (msg: string): string => {
   
   
  try {
   
   
    const parsed = JSON.parse(msg) as DispatchMsg;
    if (parsed.plugin === 'grove' && parsed.cmd === 'save_card') {
   
   
      this.saveCardToGallery(parsed.payload.base64, parsed.payload.filename);
      return JSON.stringify({
   
    ok: true, note: 'picker opened' });
    }
    return JSON.stringify({
   
    ok: false, err: 'unknown cmd' });
  } catch (e) {
   
   
    return JSON.stringify({
   
    ok: false, err
资源下载链接为:https://pan.quark.cn/s/22ca96b7bd39Citespace是一款备受学术界青睐的文献可视化与网络分析工具,广泛应用于学术研究和知识发现领域。它能够从海量文献数据中提取关键词、作者、机构、主题等信息,并揭示其关联模式,从而洞察学科发展动态与趋势。Citespace 6.2.4作为最新版本,新增了诸多功能并进行了优化,显著提升了用户体验和分析能力。安装过程:下载的“Citespace-6.2.4.msi”是Windows系统的安装文件,双击运行后会启动安装向导。安装时需遵循提示,依次完成接受许可协议、选择安装路径、设置启动选项等步骤。安装前请确保计算机满足Citespace的系统要求,如操作系统版本、Java环境等。Java环境需求:Citespace需要Java运行环境(JRE)支持,安装前需确认已安装兼容版本的Java。若未安装,安装程序可能会自动引导下载并安装Java。软件界面与功能:Citespace的界面简洁直观,由菜单栏、工具栏和工作区构成。用户可通过主界面导入BibTeX、EndNote、RIS等多种格式的文献数据,软件会自动解析信息,并以共词网络、引文网络等多种网络图形式展示。网络图分析功能:这是Citespace的核心优势之一。用户可自由选择可视化参数,如调整节点大小、颜色、边的粗细等,以突出关键信息。时间滑块功能还能动态展示知识领域的演变过程。聚类与主题挖掘:Citespace能够自动进行聚类分析,识别文献中的主题或研究领域。通过调整算法参数,可优化聚类结果,帮助用户理解不同研究之间的关联性。时间切片分析:Citespace可基于文献的年份信息创建时间切片,分析特定领域在不同时间段内的发展变化。动态视图:除了静态网络图,Citespace还提供动态视图,便于用户观察网络结构随时间的演变,更好地把
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

特立独行的猫a

您的鼓励是我的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值