1 Star 2 Fork 0

ScenarioSamples/JSVM

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

使用JSVM执行动态加载的JS代码

场景描述

通过JSVM,可以在应用运行期间直接执行一段动态加载的JS代码。也可以选择将一些对性能、底层系统调用有较高要求的核心功能用C/C++实现并将C++方法注册到JS侧,在JS代码中直接调用,提高应用的执行效率。

功能描述

通过createJsCore方法来创建一个新的JS基础运行时环境,并通过该方法获得一个虚拟机ID,通过evalUateJS方法使用虚拟机ID对应的运行环境来运行JS代码,在JS代码中创建promise并异步调取TS侧设定的callback函数,最后使用releaseJsCore方法来释放虚拟机ID对应的运行环境。

JSVM主要交互流程

img.png

场景一:JSVM执行js代码并回调c++代码

创建虚拟机所需环境,编译并执行js代码回调c++代码,销毁之前创建的虚拟机环境

配置 cmakelists: target_link_libraries(entry PUBLIC libjsvm.so)

Arkts代码

示例中包含了提供给JSVM的js里的consoleinfo同步方法,createPromise创建异步方法,执行assertEqual方法,onJSResultCallback异步方法回调。

1、调用native的创建虚拟机及环境的接口,绑定MyCallback回调(用于js代码里onJSResultCallback方法的回调),接收native返回的虚拟机id。

2、调用native的执行js代码的接口,传入虚拟机id和js代码字符串,在native侧的虚拟机里编译并执行。

3、调用native的销毁虚拟机及环境的接口,传入虚拟机id,指定销毁对应的虚拟机和环境。

import testNapi from 'libentry.so';
​
//用于JSVM执行的js代码字符串
const jsCodeStr = `{
let str = "hello World";
consoleInfo(str);
const mPromise = createPromise();
mPromise.then((result) => {
  assertEqual(result, 0);
  onJSResultCallback(result, "abc", "v");
});
str;
};`;
​
function callback(str1: string, str2: string): string {
console.log("TEST callback1 run: " + str1);
str2 = "callback done";
console.log("TEST callback1 run: " + str2);
return "callback pass";
}
​
// 创建首个运行环境,并绑定TS回调
const coreId = testNapi.createJsCore(callback);
// 在首个运行环境中执行JS代码
testNapi.evalUateJS(coreId, jsCodeStr);
// 释放首个运行环境
testNapi.releaseJsCore(coreId);

Native代码

js运行环境创建 创建让js代码运行的虚拟机环境

1、通过OH_JSVM_Init初始化虚拟机

2、通过OH_JSVM_CreateVM创建虚拟机实例

3、通过OH_JSVM_OpenVMScope创建虚拟机作用域

4、将本地函数的回调函数放到JSVM_PropertyDescriptor集合中(用于js调用的c++函数)

5、通过OH_JSVM_CreateEnv创建上下文环境并注册JSVM_PropertyDescriptor

6、通过OH_JSVM_OpenEnvScope创建上下文环境作用域

js代码执行

在虚拟机环境中编译并运行js代码

1、通过OH_JSVM_OpenHandleScope开启新的作用域

2、通过OH_JSVM_CompileScript对传入的js代码进行编译

3、通过OH_JSVM_RunScript运行js代码

4、通过OH_JSVM_CloseHandleScope关闭作用域

js运行环境销毁

关闭和销毁虚拟机和上下文环境的作用域与实例

1、使用OH_JSVM_CloseEnvScope关闭上下文环境作用域

2、使用OH_JSVM_DestroyEnv销毁上下文环境

3、使用OH_JSVM_CloseVMScope关闭虚拟机作用域

4、使用OH_JSVM_DestroyVM销毁虚拟机实例

js中调用的c++代码实现

调用的c++方法类似于napi的写法,通过OH_JSVM_GetCbInfo获取js传入方法的参数,将获取到的JSVM_Value的类型转换成c的类型。

自定义c++代码中的JSVM的常用接口与napi的接口类似,可参考文档底部的官方文档

场景二:JSVM读取并执行文件的js代码

一些场景需要去读取文件中的js代码,可将js代码放到/resources/rawfile/目录下,使用读取资源文件相关功能,将读取到的字符串使用场景一的方式在JSVM执行js代码并回调c++代码。

从资源文件中读取js代码 xxx.js文件放在/resources/rawfile/目录下

arkts代码:

获取资源对象,调用native的方法传入资源对象和文件名称

{
  let str = "hello World";
  consoleInfo(str);
  const mPromise = createPromise();
  mPromise.then((result) => {
      assertEqual(result, 0);
      onJSResultCallback(result, "abc", "v");
  });
  str;
}

Native代码:

获取arkts传入的资源对象转成native对象,获取rawfile指针对象,获取rawfile大小并申请内存,然后读取文件内容,最后关闭指针,将获取到的内容去除/r。

JSVM执行js代码

总体与场景一相同,只需修改js代码执行这段代码里的获取arkts传入的js代码字符串相关代码,将其替换为上面的从js文件中获取js字符串

官方文档:

包含各种常用接口及介绍

资源文件读取可参考文档

空文件

简介

【鸿蒙 Harmony Next 示例 代码】通过JSVM,可以在应用运行期间直接执行一段动态加载的JS代码。 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/scenario-samples/jsvm.git
git@gitee.com:scenario-samples/jsvm.git
scenario-samples
jsvm
JSVM
master

搜索帮助