#鸿蒙通关秘籍#如何通过JSVM-API创建多个引擎并执行JS代码?

HarmonyOS
3天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
银铃笑语SSD

在鸿蒙开发中,可以利用createJsCore方法创建多个JS基础运行时环境并执行JS代码。以下步骤展示了如何实现这一过程:

  1. 接口声明和编译配置

    在index.d.ts文件中,声明接口:

    typescript export const createJsCore: (fun: Function) => number; export const releaseJsCore: (a: number) => void; export const evalUateJS: (a: number, str: string) => string;

    为项目添加CMakeLists.txt编译配置:

    cmake cmake_minimum_required(VERSION 3.4.1) project(MyApplication)

    set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})

    if(DEFINED PACKAGE_FIND_FILE) include(${PACKAGE_FIND_FILE}) endif()

    include_directories(${NATIVERENDER_ROOT_PATH} ${NATIVERENDER_ROOT_PATH}/include)

    add_library(entry SHARED create_jsvm_runtime.cpp) target_link_libraries(entry PUBLIC libace_napi.z.so libjsvm.so libhilog_ndk.z.so)

  2. 创建多个运行时环境并运行JS代码

    使用create_jsvm_runtime.cpp实现多个JS运行时环境。以下为关键代码片段:

    cpp #include "napi/native_api.h" #include "ark_runtime/jsvm.h" #include "common.h"

    #include <map> #include <deque> #include <string> #include <mutex> #include <hilog/log.h>

    using namespace std;

    static map<int, JSVM_VM*> g_vmMap; static map<int, JSVM_Env*> g_envMap; static uint32_t ENVTAG_NUMBER = 0; static std::mutex envMapLock;

    static napi_value CreateJsCore(napi_env env1, napi_callback_info info) { size_t argc = 1; napi_value argv[1]; napi_get_cb_info(env1, info, &argc, argv, nullptr, nullptr); if (argc < 1) return nullptr;

    napi_ref callFun;
    napi_create_reference(env1, argv[0], 1, &callFun);
    
    napi_value coreID;
    {
        std::lock_guard<std::mutex> lock_guard(envMapLock);
        CreateArkJSContext();
        napi_create_uint32(env1, ENVTAG_NUMBER, &coreID);
        ENVTAG_NUMBER++;
    }
    return coreID;
    

    }

    static napi_value EvalUateJS(napi_env env, napi_callback_info info) { size_t argc = 2; napi_value args[2]; napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); uint32_t envId; napi_get_value_uint32(env, args[0], &envId);

    std::string dataStr = napiValueToString(env, args[1]);
    napi_value res = nullptr;
    
    {
        JSVM_HandleScope handlescope;
        OH_JSVM_OpenHandleScope(*g_envMap[envId], &handlescope);
    
        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);
    
        JSVM_Value result;
        OH_JSVM_RunScript(*g_envMap[envId], script, &result);
    
        JSVM_CloseHandleScope(*g_envMap[envId], handlescope);
    }
    return res;
    

    }

  3. 模块注册

    在create_jsvm_runtime.cpp文件中注册模块:

    cpp EXTERN_C_START static napi_value Init(napi_env env, napi_value exports) { napi_property_descriptor desc[] = { {"createJsCore", nullptr, CreateJsCore, nullptr, nullptr, nullptr, napi_default, nullptr}, {"releaseJsCore", nullptr, ReleaseJsCore, nullptr, nullptr, nullptr, napi_default, nullptr}, {"evalUateJS", nullptr, EvalUateJS, nullptr, nullptr, nullptr, napi_default, nullptr} }; napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); return exports; } EXTERN_C_END

    static napi_module demoModule = { .nm_version = 1, .nm_flags = 0, .nm_filename = nullptr, .nm_register_func = Init, .nm_modname = "entry", .nm_priv = ((void *)0), .reserved = {0}, };

    extern "C" attribute((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }

创建多个JSVM运行环境并通过evalUateJS方法执行代码,为应用开发提供了更灵活的方案。


分享
微博
QQ
微信
回复
3天前
相关问题
基于JSVM创建引擎执行JS代码销毁
417浏览 • 1回复 待解决
JSVM-API的应用场景有哪些?
419浏览 • 1回复 待解决
ArkUI如何通过代码动态创建组件
2489浏览 • 1回复 待解决