#鸿蒙通关秘籍#如何在鸿蒙中使用JSVM-API编译和执行JavaScript代码

HarmonyOS
2024-12-17 11:59:08
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
API风中琴

使用JSVM-API在鸿蒙中编译和执行JavaScript代码,首先通过OH_JSVM_CompileScript对JavaScript源码进行编译,生成可以执行的脚本对象。代码执行是通过OH_JSVM_RunScript接口完成的。编译后的脚本可以生成code cache,利用OH_JSVM_CreateCodeCache存储编译结果,提高处理速度。在执行过程中,确保资源如Handle Scope等被正确使用和关闭。

cpp static void RunScript(JSVM_Env env, string& src, bool withOrigin = false, const uint8_t** dataPtr = nullptr, size_t* lengthPtr = nullptr) { JSVM_HandleScope handleScope; OH_JSVM_OpenHandleScope(env, &handleScope);

JSVM_Value jsSrc;
OH_JSVM_CreateStringUtf8(env, src.c_str(), src.size(), &jsSrc);

const uint8_t* data = dataPtr ? *dataPtr : nullptr;
size_t length = lengthPtr ? *lengthPtr : 0;
bool cacheRejected = true;
JSVM_Script script;
OH_JSVM_CompileScript(env, jsSrc, data, length, true, &cacheRejected, &script);
printf("Code cache is %s\n", cacheRejected ? "rejected" : "used");

JSVM_Value result;
OH_JSVM_RunScript(env, script, &result);

if (dataPtr && lengthPtr && *dataPtr == nullptr) {
    OH_JSVM_CreateCodeCache(env, script, dataPtr, lengthPtr);
}

OH_JSVM_CloseHandleScope(env, handleScope);

}

static void CreateSnapshot() { JSVM_VM vm; JSVM_CreateVMOptions options; memset(&options, 0, sizeof(options)); options.isForSnapshotting = true; OH_JSVM_CreateVM(&options, &vm); JSVM_VMScope vmScope; OH_JSVM_OpenVMScope(vm, &vmScope);

JSVM_Env env;
JSVM_PropertyDescriptor descriptors[] = {
    { "hello", NULL, &hello_cb, NULL, NULL, NULL, JSVM_DEFAULT }
};
OH_JSVM_CreateEnv(vm, 1, descriptors, &env);

JSVM_EnvScope envScope;
OH_JSVM_OpenEnvScope(env, &envScope);
string src = "concat(hello(), ', ', 'World from CreateSnapshot!');";
RunScript(env, src);

const char* blobData = nullptr;
size_t blobSize = 0;
JSVM_Env envs[1] = { env };
OH_JSVM_CreateSnapshot(vm, 1, envs, &blobData, &blobSize);

ofstream file("/data/storage/el2/base/files/blob.bin", ios::out | ios::binary | ios::trunc);
file.write(blobData, blobSize);
file.close();

OH_JSVM_CloseEnvScope(env, envScope);
OH_JSVM_DestroyEnv(env);
OH_JSVM_CloseVMScope(vm, vmScope);
OH_JSVM_DestroyVM(vm);

}


分享
微博
QQ
微信
回复
2024-12-17 13:15:13
相关问题
JSVM-API的应用场景有哪些?
985浏览 • 1回复 待解决