基于JSVM创建引擎执行JS代码并销毁
通过JSVM,可以在应用运行期间直接执行一段动态加载的JS代码。也可以选择将一些对性能、底层系统调用有较高要求的核心功能用C/C++实现并将C++方法注册到JS侧,在JS代码中直接调用,提高应用的执行效率。
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
如何使用JSVM-API接口创建多个引擎执行JS代码并销毁
212浏览 • 1回复 待解决
启动一个Ability后,如何感知该Ability的销毁,并执行某些操作
1853浏览 • 1回复 待解决
启动一个UIAbility后,如何感知该UIAbility的销毁,并执行某些操作
1927浏览 • 1回复 待解决
如何在ArkTS代码中执行HTML内的JS函数
2090浏览 • 1回复 待解决
使用js引擎 设置dom背景色无效
662浏览 • 0回复 待解决
XHR使用POST提交方式异步导致js代码提前执行
1972浏览 • 1回复 待解决
HarmonyOS 需要灵活创建和销毁组件的方式
178浏览 • 1回复 待解决
关于 OH_JSVM_CreateReference 创建非对象引用报错
285浏览 • 1回复 待解决
HarmonyOS关于JSVM中创建原生对象的生命周期问题
234浏览 • 1回复 待解决
HarmonyOS 如何创建一个json文件,然后再代码里获取并使用它?
83浏览 • 1回复 待解决
基于Code Linter实现代码检查
288浏览 • 1回复 待解决
如何判断JS运行时是否处于HarmonyOS JSVM环境中
264浏览 • 1回复 待解决
如何使用HarmonyOS内置的JS引擎?JIT支持策略如何
212浏览 • 1回复 待解决
HarmonyOS taskpool执行task后后续代码没有执行
101浏览 • 0回复 待解决
浏览网页时的cookies、 cache data 等数据如何在销毁Web组件时也一并销毁?
209浏览 • 1回复 待解决
PolarDB实例创建并支付完成后,如何创建新账号?
2953浏览 • 1回复 待解决
HarmonyOS 代码延迟时间执行方法
278浏览 • 1回复 待解决
请问有是在openharmony上,基于传统代码方式JS,开发 wlan 和 bluetooth 相关的完整例程么?
2815浏览 • 1回复 待解决
基于AOP的代码插桩,都有哪些场景?
527浏览 • 1回复 待解决
NAPI 通过 napi_wrap 创建的对象似乎没有被销毁
1652浏览 • 1回复 待解决
docker如何在后台执行jar代码?
2522浏览 • 1回复 待解决
ArkUI如何通过代码动态创建组件
2170浏览 • 1回复 待解决
JS 获取控件位置并动态赋值的问题
3765浏览 • 1回复 待解决
在native侧创建file并保存进沙箱路径
930浏览 • 1回复 待解决
如何在openharmony中执行js脚本
2455浏览 • 0回复 待解决
通过createJsCore方法来创建一个新的JS基础运行时环境,并通过该方法获得一个虚拟机ID,通过evalUateJS方法使用虚拟机ID对应的运行环境来运行JS代码,在JS代码中创建promise并异步调取TS侧设定的callback函数,最后使用releaseJsCore方法来释放虚拟机ID对应的运行环境。
JSVM主要交互流程
接口介绍
创建所需接口:
执行所需接口:
关闭所需接口:
场景代码
场景一:JSVM执行JS代码并回调C++代码
创建虚拟机所需环境,编译并执行JS代码回调C++代码,销毁之前创建的虚拟机环境。
配置
cmakelists:
ArkTS代码:
示例中包含了提供给JSVM的JS里的consoleinfo同步方法,createPromise创建异步方法,执行assertEqual方法,onJSResultCallback异步方法回调。
1. 调用Native的创建虚拟机及环境的接口,绑定MyCallback回调(用于JS代码里onJSResultCallback方法的回调),接收native返回的虚拟机id。
2. 调用Native的执行JS代码的接口,传入虚拟机id和JS代码字符串,在native侧的虚拟机里编译并执行。
3. 调用Native的销毁虚拟机及环境的接口,传入虚拟机id,指定销毁对应的虚拟机和环境。
可以同时运行多个JSVM虚拟机执行多个JS代码。
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代码。
通过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的接口类似,可参考文档底部的官方文档。
同步方法
用于打印日志的简单同步方法:
用于相加的简单同步方法:
异步方法
Promise方式的异步调用,主要调用OH_JSVM_CreatePromise创建一个延迟对象和一个JavaScript promise,OH_JSVM_ResolveDeferred通过与之关联的延迟对象来解析JavaScript promise,用于解析对应的可用的延迟对象的JavaScript Promise
可参考NAPI的异步任务:使用Node-API接口进行异步任务开发。
callback方式的异步调用,需要调用NAPI的异步调用方法。
OH_JSVM_StrictEquals提供类似调用严格相等算法的行为。
代码中使用的全局变量和工具方法,包含自定义的全局变量和工具方法。
场景二:JSVM读取并执行文件的JS代码
一些场景需要去读取文件中的JS代码,可将JS代码放到/resources/rawfile/目录下,使用读取资源文件相关功能,将读取到的字符串,使用场景一的方式在JSVM执行JS代码,并回调C++代码。
从资源文件中读取JS代码
xxx.js文件放在/resources/rawfile/目录下
xxx.js
配置cmakelists:
ArkTS代码:
获取资源对象,调用native的方法传入资源对象和文件名称。
Native代码:
获取ArkTS传入的资源对象转成native对象,获取rawfile指针对象,获取rawfile大小并申请内存,然后读取文件内容,最后关闭指针,将获取到的内容去除\r。
JSVM执行JS代码
总体与场景一相同,只需修改JS代码,执行这段代码里获取ArkTS传入的JS字符串相关代码,将其替换为上面从JS文件中获取到的JS字符串。
官方文档
包含各种常用接口及介绍:JSVM。
资源文件读取可参考文档:Rawfile开发指导。