如何使用JSVM-API接口创建多个引擎执行JS代码并销毁

如何使用JSVM-API接口创建多个引擎执行JS代码并销毁

HarmonyOS
2024-07-21 19:09:32
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
mzshj

通过CreateJsCore方法来创建一个新的JS基础运行时环境同时获得一个CoreID;

static napi_value CreateJsCore(napi_env env1, napi_callback_info info) { 
  OH_LOG_INFO(LOG_APP, "JSVM CreateJsCore START"); 
  size_t argc = 1; 
  napi_value argv[1]; 
  napi_get_cb_info(env1, info, &argc, argv, nullptr, nullptr); 
  if (argc < 1) { 
    OH_LOG_ERROR(LOG_APP, "JSVM CreateJsCore the number of params must be one"); 
    return nullptr; 
  } 
  g_napiEnvMap[ENVTAG_NUMBER] = env1; 
  g_taskQueueMap[ENVTAG_NUMBER] = deque<Task *>{}; 
  // 将TS侧传入的回调函数与env对应存储方便后续调用 
  napi_ref callFun; 
  napi_create_reference(env1, argv[0], 1, &callFun); 
  g_callBackMap[ENVTAG_NUMBER] = callFun; 
  napi_value coreID = 0; 
  { 
    std::lock_guard<std::mutex> lock_guard(envMapLock); 
    CreateArkJSContext(); 
    napi_create_uint32(env1, ENVTAG_NUMBER, &coreID); 
    ENVTAG_NUMBER++; 
  } 
  OH_LOG_INFO(LOG_APP, "JSVM CreateJsCore END"); 
  return coreID; 
}

通过EvalUateJS方法使用CoreID对应的运行环境来运行JS代码;

static napi_value EvalUateJS(napi_env env, napi_callback_info info) { 
  OH_LOG_INFO(LOG_APP, "JSVM EvalUateJS START"); 
  size_t argc = 2; 
  napi_value args[2] = {nullptr}; 
  napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 
  uint32_t envId; 
  napi_status status = napi_get_value_uint32(env, args[0], &envId); 
  if (status != napi_ok) { 
    OH_LOG_ERROR(LOG_APP, "EvalUateJS first param should be number"); 
    return nullptr; 
  } 
 
  if (g_envMap.count(envId) == 0 || g_envMap[envId] == nullptr) { 
    OH_LOG_ERROR(LOG_APP, "EvalUateJS env is null"); 
    return nullptr; 
  } 
  std::string dataStr = napiValueToString(env, args[1]); 
  napi_value res = nullptr; 
  std::lock_guard<std::mutex> lock_guard(mutexLock); 
  { 
    // open handle scope 
    JSVM_HandleScope handlescope; 
    OH_JSVM_OpenHandleScope(*g_envMap[envId], &handlescope); 
    // compile js script 
    JSVM_Value sourcecodevalue; 
    OH_JSVM_CreateStringUtf8(*g_envMap[envId], dataStr.c_str(), dataStr.size(), &sourcecodevalue); 
    JSVM_Script script; 
    OH_JSVM_CompileScript(*g_envMap[envId], sourcecodevalue, nullptr, 0, true, nullptr, &script); 
    // run js script 
    JSVM_Value result; 
    OH_JSVM_RunScript(*g_envMap[envId], script, &result); 
    JSVM_ValueType type; 
    OH_JSVM_Typeof(*g_envMap[envId], result, &type); 
    OH_LOG_INFO(LOG_APP, "JSVM API TEST type: %{public}d", type); 
    // Execute tasks in the current env event queue 
    while (!g_taskQueueMap[envId].empty()) { 
      auto task = g_taskQueueMap[envId].front(); 
      g_taskQueueMap[envId].pop_front(); 
      task->Run(); 
      delete task; 
    } 
 
    if (type == JSVM_STRING) { 
      std::string stdResult = fromOHStringValue(*g_envMap[envId], result); 
      napi_create_string_utf8(env, stdResult.c_str(), stdResult.length(), &res); 
    } else if (type == JSVM_BOOLEAN) { 
      bool ret = false; 
      std::string stdResult; 
      OH_JSVM_GetValueBool(*g_envMap[envId], result, &ret); 
      ret ? stdResult = "true" : stdResult = "false"; 
      napi_create_string_utf8(env, stdResult.c_str(), stdResult.length(), &res); 
    } else if (type == JSVM_NUMBER) { 
      int32_t num; 
      OH_JSVM_GetValueInt32(*g_envMap[envId], result, &num); 
      std::string stdResult = std::to_string(num); 
      napi_create_string_utf8(env, stdResult.c_str(), stdResult.length(), &res); 
    } else if (type == JSVM_OBJECT) { 
      JSVM_Value objResult; 
      OH_JSVM_JsonStringify(*g_envMap[envId], result, &objResult); 
      std::string stdResult = fromOHStringValue(*g_envMap[envId], objResult); 
      napi_create_string_utf8(env, stdResult.c_str(), stdResult.length(), &res); 
    } 
    OH_JSVM_CloseHandleScope(*g_envMap[envId], handlescope); 
  } 
  OH_LOG_INFO(LOG_APP, "JSVM EvalUateJS END"); 
  return res; 
}

通过ReleaseJsCore方法来释放CoreID对应的运行环境。

static napi_value ReleaseJsCore(napi_env env1, napi_callback_info info) { 
  OH_LOG_INFO(LOG_APP, "JSVM ReleaseJsCore START"); 
  size_t argc = 1; 
  napi_value argv[1]; 
  napi_get_cb_info(env1, info, &argc, argv, nullptr, nullptr); 
  if (argc < 1) { 
    OH_LOG_ERROR(LOG_APP, "JSVM ReleaseJsCore the number of params must be one"); 
    return nullptr; 
  } 
 
  uint32_t coreEnvId; 
  napi_status status = napi_get_value_uint32(env1, argv[0], &coreEnvId); 
  if (status != napi_ok) { 
    OH_LOG_ERROR(LOG_APP, "JSVM CreateJsCore napi_get_value_uint32 faild"); 
    return nullptr; 
  } 
  if (g_envMap.count(coreEnvId) == 0 ) { 
    OH_LOG_ERROR(LOG_APP, "JSVM CreateJsCore not has env "); 
    return nullptr; 
  } 
  if (g_envMap[coreEnvId] != nullptr) { 
    std::lock_guard<std::mutex> lock_guard(envMapLock); 
    OH_JSVM_CloseEnvScope(*g_envMap[coreEnvId], g_envScopeMap[coreEnvId]); 
    g_envScopeMap.erase(coreEnvId); 
    OH_JSVM_DestroyEnv(*g_envMap[coreEnvId]); 
    g_envMap[coreEnvId] = nullptr; 
    g_envMap.erase(coreEnvId); 
    OH_JSVM_CloseVMScope(*g_vmMap[coreEnvId], g_vmScopeMap[coreEnvId]); 
    g_vmScopeMap.erase(coreEnvId); 
    OH_JSVM_DestroyVM(*g_vmMap[coreEnvId]); 
    g_vmMap[coreEnvId] = nullptr; 
    g_vmMap.erase(coreEnvId); 
    delete [] g_callBackStructMap[coreEnvId]; 
    g_callBackStructMap[coreEnvId] = nullptr; 
    g_callBackStructMap.erase(coreEnvId); 
    napi_delete_reference(env1, g_callBackMap[coreEnvId]); 
    g_callBackMap.erase(coreEnvId); 
    g_taskQueueMap.erase(coreEnvId); 
  } 
  OH_LOG_INFO(LOG_APP, "JSVM ReleaseJsCore END"); 
  return nullptr; 
}
分享
微博
QQ
微信
回复
2024-07-22 11:11:03
相关问题
基于JSVM创建引擎执行JS代码销毁
128浏览 • 1回复 待解决
JSVM-API的应用场景有哪些?
82浏览 • 1回复 待解决
使用js引擎 设置dom背景色无效
500浏览 • 0回复 待解决
如何在ArkTS代码执行HTML内的JS函数
1743浏览 • 1回复 待解决
创建JS项目如何使用webview?
4372浏览 • 1回复 待解决
js api 中select组件如何使用
6568浏览 • 2回复 已解决
鸿蒙JS API7新增的接口在哪里
5356浏览 • 1回复 待解决
如何调用测试一个wifi接口
5911浏览 • 1回复 待解决
ArkUI如何通过代码动态创建组件
1904浏览 • 1回复 待解决
JS API 中 web组件 怎么使用
4901浏览 • 1回复 待解决
docker如何在后台执行jar代码?
2315浏览 • 1回复 待解决
创建多个视频组件无法播放
1754浏览 • 1回复 待解决
什么场景需要创建多个UIAbility
1549浏览 • 1回复 待解决
如何在openharmony中执行js脚本
2272浏览 • 0回复 待解决