通过JSVM,可以在应用运行期间直接执行一段动态加载的JS代码。也可以选择将一些对性能、底层系统调用有较高要求的核心功能用C/C++实现并将C++方法注册到JS侧,在JS代码中直接调用,提高应用的执行效率。
通过createJsCore方法来创建一个新的JS基础运行时环境,并通过该方法获得一个虚拟机ID,通过evalUateJS方法使用虚拟机ID对应的运行环境来运行JS代码,在JS代码中创建promise并异步调取TS侧设定的callback函数,最后使用releaseJsCore方法来释放虚拟机ID对应的运行环境。
创建虚拟机所需环境,编译并执行js代码回调c++代码,销毁之前创建的虚拟机环境
配置 cmakelists: target_link_libraries(entry PUBLIC libjsvm.so)
示例中包含了提供给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);
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代码
1、通过OH_JSVM_OpenHandleScope开启新的作用域
2、通过OH_JSVM_CompileScript对传入的js代码进行编译
3、通过OH_JSVM_RunScript运行js代码
4、通过OH_JSVM_CloseHandleScope关闭作用域
关闭和销毁虚拟机和上下文环境的作用域与实例
1、使用OH_JSVM_CloseEnvScope关闭上下文环境作用域
2、使用OH_JSVM_DestroyEnv销毁上下文环境
3、使用OH_JSVM_CloseVMScope关闭虚拟机作用域
4、使用OH_JSVM_DestroyVM销毁虚拟机实例
调用的c++方法类似于napi的写法,通过OH_JSVM_GetCbInfo获取js传入方法的参数,将获取到的JSVM_Value的类型转换成c的类型。
自定义c++代码中的JSVM的常用接口与napi的接口类似,可参考文档底部的官方文档
一些场景需要去读取文件中的js代码,可将js代码放到/resources/rawfile/目录下,使用读取资源文件相关功能,将读取到的字符串使用场景一的方式在JSVM执行js代码并回调c++代码。
从资源文件中读取js代码 xxx.js文件放在/resources/rawfile/目录下
获取资源对象,调用native的方法传入资源对象和文件名称
{
let str = "hello World";
consoleInfo(str);
const mPromise = createPromise();
mPromise.then((result) => {
assertEqual(result, 0);
onJSResultCallback(result, "abc", "v");
});
str;
}
获取arkts传入的资源对象转成native对象,获取rawfile指针对象,获取rawfile大小并申请内存,然后读取文件内容,最后关闭指针,将获取到的内容去除/r。
总体与场景一相同,只需修改js代码执行这段代码里的获取arkts传入的js代码字符串相关代码,将其替换为上面的从js文件中获取js字符串
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。