| 接口 | 功能说明 |
|---|---|
| OH_JSVM_SetDebugOption | 启用/禁用特定JSVM_Env的指定debug选项。传入的debug选项参数debugOption必须为JSVM_DebugOption类型,布尔值参数isEnabled用于控制是否开启该debug选项。此API仅供debug时使用,开启后可能会带来性能下降。 |
仅需替换使用JSVM-API实现JS与C/C++语言交互开发流程示例代码中的“TestJSVM()”函数即可运行。
static int32_t TestJSVM()
{
JSVM_InitOptions initOptions = {0};
JSVM_VM vm;
JSVM_Env env = nullptr;
JSVM_VMScope vmScope;
JSVM_EnvScope envScope;
JSVM_HandleScope handleScope;
// 初始化JavaScript引擎实例
if (g_aa == 0) {
g_aa++;
CHECK(OH_JSVM_Init(&initOptions));
}
// 创建JSVM环境
CHECK(OH_JSVM_CreateVM(nullptr, &vm));
CHECK(OH_JSVM_OpenVMScope(vm, &vmScope));
CHECK(OH_JSVM_CreateEnv(vm, sizeof(descriptor) / sizeof(descriptor[0]), descriptor, &env));
// 打开JSVM_SCOPE_CHECK校验选项
CHECK(OH_JSVM_SetDebugOption(env, JSVM_SCOPE_CHECK, true));
CHECK_RET(OH_JSVM_OpenEnvScope(env, &envScope));
// 打开HandleScope
CHECK_RET(OH_JSVM_OpenHandleScope(env, &handleScope));
// 通过script调用测试函数
JSVM_Script script;
JSVM_Value jsSrc, result;
CHECK_RET(OH_JSVM_CreateStringUtf8(env, SRC_CALL_NATIVE, JSVM_AUTO_LENGTH, &jsSrc));
CHECK_RET(OH_JSVM_CompileScript(env, jsSrc, nullptr, 0, true, nullptr, &script));
CHECK_RET(OH_JSVM_RunScript(env, script, &result));
bool boolResult = true;
// OH_JSVM_IsBoolean接口调用JSVM_Value类型变量result
JSVM_Status status = OH_JSVM_IsBoolean(env, result, &boolResult);
if (status != JSVM_OK) {
OH_LOG_ERROR(LOG_APP, "JSVM OH_JSVM_IsBoolean: failed");
} else {
OH_LOG_INFO(LOG_APP, "JSVM OH_JSVM_IsBoolean: success: %{public}d", boolResult);
}
// 销毁JSVM环境
// 关闭HandleScope
CHECK_RET(OH_JSVM_CloseHandleScope(env, handleScope));
CHECK_RET(OH_JSVM_CloseEnvScope(env, envScope));
// 关闭JSVM_SCOPE_CHECK校验选项
CHECK(OH_JSVM_SetDebugOption(env, JSVM_SCOPE_CHECK, false));
CHECK(OH_JSVM_DestroyEnv(env));
CHECK(OH_JSVM_CloseVMScope(vm, vmScope));
CHECK(OH_JSVM_DestroyVM(vm));
return 0;
} 执行结果
hilog中有以下结果输出:
JSVM OH_JSVM_IsBoolean: success: 1
static int32_t TestJSVM()
{
JSVM_InitOptions initOptions = {0};
JSVM_VM vm;
JSVM_Env env = nullptr;
JSVM_VMScope vmScope;
JSVM_EnvScope envScope;
JSVM_HandleScope handleScope;
// 初始化JavaScript引擎实例
if (g_aa == 0) {
g_aa++;
CHECK(OH_JSVM_Init(&initOptions));
}
// 创建JSVM环境
CHECK(OH_JSVM_CreateVM(nullptr, &vm));
CHECK(OH_JSVM_OpenVMScope(vm, &vmScope));
CHECK(OH_JSVM_CreateEnv(vm, sizeof(descriptor) / sizeof(descriptor[0]), descriptor, &env));
// 打开JSVM_SCOPE_CHECK校验选项
CHECK(OH_JSVM_SetDebugOption(env, JSVM_SCOPE_CHECK, true));
CHECK_RET(OH_JSVM_OpenEnvScope(env, &envScope));
// 打开HandleScope
CHECK_RET(OH_JSVM_OpenHandleScope(env, &handleScope));
// 通过script调用测试函数
JSVM_Script script;
JSVM_Value jsSrc, result;
CHECK_RET(OH_JSVM_CreateStringUtf8(env, SRC_CALL_NATIVE, JSVM_AUTO_LENGTH, &jsSrc));
CHECK_RET(OH_JSVM_CompileScript(env, jsSrc, nullptr, 0, true, nullptr, &script));
CHECK_RET(OH_JSVM_RunScript(env, script, &result));
bool boolResult = true;
// 销毁JSVM环境
// 关闭HandleScope
CHECK_RET(OH_JSVM_CloseHandleScope(env, handleScope));
// OH_JSVM_IsBoolean接口在错误的HandleScope调用JSVM_Value类型变量result
JSVM_Status status = OH_JSVM_IsBoolean(env, result, &boolResult);
CHECK_RET(OH_JSVM_CloseEnvScope(env, envScope));
// 关闭JSVM_SCOPE_CHECK校验选项
CHECK(OH_JSVM_SetDebugOption(env, JSVM_SCOPE_CHECK, false));
CHECK(OH_JSVM_DestroyEnv(env));
CHECK(OH_JSVM_CloseVMScope(vm, vmScope));
CHECK(OH_JSVM_DestroyVM(vm));
return 0;
} 执行结果
程序崩溃,有cppcrash日志生成,在hilog中可以检索到类似以下的信息:
JSVM Fatal Error Position : "../../../../../../../arkcompiler/jsvm/src/js_native_api_v8.cpp":4537 JSVM Fatal Error Message : "Run in wrong HandleScope"