相关问题
#鸿蒙通关秘籍#如何在鸿蒙中使用JSVM-API编译和执行JavaScript代码
473浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何通过JSVM-API创建多个引擎并执行JS代码?
376浏览 • 1回复 待解决
#鸿蒙通关秘籍#鸿蒙应用中如何使用JSVM-API进行内存管理
434浏览 • 1回复 待解决
如何使用JSVM-API接口创建多个引擎执行JS代码并销毁
673浏览 • 1回复 待解决
#鸿蒙通关秘籍#怎样使用Popup来提供上下文提示?
406浏览 • 1回复 待解决
#鸿蒙通关秘籍#创建和管理Node-API中复杂JavaScript对象的方式有哪些?
283浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何使用featureAbility的getContext接口获取应用上下文?
514浏览 • 1回复 待解决
#鸿蒙通关秘籍#鸿蒙中如何获取UIAbility的上下文信息?
474浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在HarmonyOS中创建一个WebGL2上下文?
567浏览 • 1回复 待解决
#鸿蒙通关秘籍#怎样在鸿蒙环境中使用JSVM-API进行Promise操作
274浏览 • 1回复 待解决
#鸿蒙通关秘籍#在UIAbility中如何获取UIAbilityContext上下文信息?
454浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何绑定和响应长按弹出的上下文菜单?
378浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在HarmonyOS中初始化WebGL上下文?
612浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何创建和管理鸿蒙Worker线程?
591浏览 • 1回复 待解决
#鸿蒙通关秘籍#在HarmonyOS Next中,如何使用全局上下文存储Preferences实例?
493浏览 • 1回复 待解决
HarmonyOS 获取上下文Context
438浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙系统中初始化WebGL上下文?
492浏览 • 1回复 待解决
#鸿蒙通关秘籍#arkts 如何在非页面组件获取应用上下文
570浏览 • 2回复 待解决
#鸿蒙通关秘籍#在鸿蒙中如何使用geometryTransition实现搜索框的上下文过渡?
440浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在HarmonyOS中从canvas组件获取WebGL上下文?
333浏览 • 1回复 待解决
如何获取应用上下文Context?
903浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙应用中利用JSVM-API进行JS对象属性操作
386浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙应用中通过JSVM-API解析和序列化JSON
344浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在ArkTS中创建和管理Worker线程?
578浏览 • 2回复 待解决
#鸿蒙通关秘籍#如何创建和管理应用的子窗口?
496浏览 • 1回复 待解决
通过JSVM-API创建JavaScript执行上下文需要经历几个关键步骤。首先,初始化JavaScript虚拟机引擎,使用
OH_JSVM_Init
函数进行必要的引擎初始化操作。接着,通过OH_JSVM_CreateVM
创建虚拟机实例,并使用OH_JSVM_CreateEnv
创建JavaScript执行上下文。需要管理好生命周期,可以借助OH_JSVM_OpenVMScope
和OH_JSVM_CloseVMScope
控制虚拟机的作用域,OH_JSVM_OpenEnvScope
和OH_JSVM_CloseEnvScope
管理执行环境作用域。所有的资源在执行完成后都需要合理释放,最终销毁环境和实例。cpp bool VM_INIT = false;
// 初始化 JavaScript 引擎实例 static JSVM_Value ConsoleInfo(JSVM_Env env, JSVM_CallbackInfo info) { size_t argc = 1; JSVM_Value args[1]; char log[256] = ""; size_t logLength; OH_JSVM_GetCbInfo(env, info, &argc, args, NULL, NULL);
}
static napi_value MyJSVMDemo(`maybe_unused` napi_env _env, `maybe_unused` napi_callback_info _info) { std::thread t( { if (!VM_INIT) { JSVM_InitOptions initOptions; memset(&initOptions, 0, sizeof(initOptions)); OH_JSVM_Init(&initOptions); VM_INIT = true; } JSVM_VM vm; JSVM_CreateVMOptions options; memset(&options, 0, sizeof(options)); OH_JSVM_CreateVM(&options, &vm); JSVM_VMScope vmScope; OH_JSVM_OpenVMScope(vm, &vmScope); JSVM_CallbackStruct param[] = { {.data = nullptr, .callback = ConsoleInfo}, }; JSVM_PropertyDescriptor descriptor[] = { {"consoleinfo", NULL, ¶m[0], NULL, NULL, NULL, JSVM_DEFAULT}, }; JSVM_Env env; OH_JSVM_CreateEnv(vm, sizeof(descriptor) / sizeof(descriptor[0]), descriptor, &env); JSVM_EnvScope envScope; OH_JSVM_OpenEnvScope(env, &envScope); JSVM_HandleScope handleScope; OH_JSVM_OpenHandleScope(env, &handleScope); std::string sourceCodeStr = "let value = consoleinfo('Hello JSVM!');"; JSVM_Value sourceCodeValue; OH_JSVM_CreateStringUtf8(env, sourceCodeStr.c_str(), sourceCodeStr.size(), &sourceCodeValue); JSVM_Script script; OH_JSVM_CompileScript(env, sourceCodeValue, nullptr, 0, true, nullptr, &script); JSVM_Value result; OH_JSVM_RunScript(env, script, &result); OH_JSVM_CloseHandleScope(env, handleScope); OH_JSVM_CloseEnvScope(env, envScope); OH_JSVM_DestroyEnv(env); OH_JSVM_CloseVMScope(vm, vmScope); OH_JSVM_DestroyVM(vm); });
}