#鸿蒙通关秘籍#如何使用JSVM-API创建和管理JavaScript执行上下文

HarmonyOS
1天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
星辰绘API

通过JSVM-API创建JavaScript执行上下文需要经历几个关键步骤。首先,初始化JavaScript虚拟机引擎,使用OH_JSVM_Init函数进行必要的引擎初始化操作。接着,通过OH_JSVM_CreateVM创建虚拟机实例,并使用OH_JSVM_CreateEnv创建JavaScript执行上下文。需要管理好生命周期,可以借助OH_JSVM_OpenVMScopeOH_JSVM_CloseVMScope控制虚拟机的作用域,OH_JSVM_OpenEnvScopeOH_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);

OH_JSVM_GetValueStringUtf8(env, args[0], log, 255, &logLength);
log[255] = 0;
OH_LOG_INFO(LOG_APP, "JSVM API TEST: %{public}s", log);
return nullptr;

}

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, &param[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); });

t.detach();

return nullptr;

}


分享
微博
QQ
微信
回复
1天前
相关问题
如何获取应用上下文Context?
489浏览 • 1回复 待解决
无法从static上下文引用非static方法
10060浏览 • 1回复 待解决
上下文工具类的方法有哪些?
278浏览 • 1回复 待解决
如何在普通ets文件中获取上下文Context
1141浏览 • 1回复 待解决