轻量 OpenHarmony 设备上,页面多半是 JS,真正碰硬件和系统能力的是 C++。脚本不能直接操作外设、图形栈或系统服务,中间需要一座稳定的桥。ACE Lite 提供的这座桥叫 JSI(JavaScript Interface)。它把引擎细节挡在后面,JS 只看见模块名和方法名,C++ 负责落地。换脚本引擎时,页面和模块接口可以尽量不动。

JSI 里往来的都是JSIValue。它是引擎堆上的不透明句柄,不是普通 C++ 对象,不能当指针解引用,也不能假设作用域结束就会自动消失。一个自定义模块通常只需要两样东西:模块短名,以及一个初始化函数。引擎在页面requires到该模块时,会把一个exports对象传给初始化函数。产品代码往这个对象上挂方法即可.exports 由框架创建和持有,初始化函数不要释放它。

注册时机很重要。产品模块必须在 JS 引擎开始加载页面前挂到模块管理器上,否则第一次requires 会找不到。ACE Lite 通过产品适配层提供「取模块表」的回调,和系统自带的路由、应用信息、对话框走同一条加载路径。模块名一般只写短名,system、ohos 这类前缀由框架按调用方式补齐。自己拼接前缀,容易和系统模块重名,也会让页面侧的引用写法不统一。

挂方法时,把 C++ 函数指针绑到一个 JS 可调用的名字上。回调形态是固定的:当前this、参数数组、参数个数,返回一个JSIValue。进入函数后先看参数个数和类型,再取值;异常或参数不合法时返回明确结果,不要直接往下解引用。返回值交给框架,由它传回脚本。产品能力优先接到已有模块上,而不是再开一套私有通道,这样页面调用方式才能保持一致。

JSI 解决的是「JS 怎么安全地喊到 C++」,不解释业务协议,也不代替线程模型和内存管理。把模块边界划清楚,后面的取值、释放、投递 UI 才有地方挂。

JSI::SetModuleAPI(exports, "getInfo", NativeGetInfo);

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐