1# 使用Node-API接口创建ArkTS运行时环境
2
3## 场景介绍
4
5开发者通过pthread_create创建新线程后,可以通过`napi_create_ark_runtime`来创建一个新的ArkTS基础运行时环境,并通过该运行时环境加载ArkTS模块。当使用结束后,开发者需要通过`napi_destroy_ark_runtime`来销毁所创建的ArkTS基础运行时环境。
6
7## 约束限制
8
9一个进程最多只能创建16个运行时环境。
10
11## 使用示例
12
131. 接口声明、编译配置以及模块注册。
14
15   **接口声明**
16
17   ```ts
18   // index.d.ts
19   export const createArkRuntime: () => object;
20   ```
21
22   **编译配置**
23
24   ```
25   // CMakeLists.txt
26   # the minimum version of CMake.
27   cmake_minimum_required(VERSION 3.4.1)
28   project(MyApplication)
29
30   set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
31
32   include_directories(${NATIVERENDER_ROOT_PATH}
33                       ${NATIVERENDER_ROOT_PATH}/include)
34   add_library(entry SHARED create_ark_runtime.cpp)
35   target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so)
36   ```
37
38   在当前模块的build-profile.json5文件中进行以下配置:
39   ```json
40   {
41       "buildOption" : {
42           "arkOptions" : {
43               "runtimeOnly" : {
44                   "sources": [
45                       "./src/main/ets/pages/ObjectUtils.ets"
46                   ]
47               }
48           }
49       }
50   }
51   ```
52
53   **模块注册**
54
55   ```cpp
56   // create_ark_runtime.cpp
57   EXTERN_C_START
58   static napi_value Init(napi_env env, napi_value exports)
59   {
60       napi_property_descriptor desc[] = {
61           { "createArkRuntime", nullptr, CreateArkRuntime, nullptr, nullptr, nullptr, napi_default, nullptr }
62       };
63       napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
64       return exports;
65   }
66   EXTERN_C_END
67
68   static napi_module nativeModule = {
69       .nm_version = 1,
70       .nm_flags = 0,
71       .nm_filename = nullptr,
72       .nm_register_func = Init,
73       .nm_modname = "entry",
74       .nm_priv = nullptr,
75       .reserved = { 0 },
76   };
77
78   extern "C" __attribute__((constructor)) void RegisterQueueWorkModule()
79   {
80       napi_module_register(&nativeModule);
81   }
82   ```
83
842. 新建线程并创建ArkTS基础运行时环境,加载自定义模块请参考[napi_load_module_with_info](./use-napi-load-module-with-info.md)。
85
86   ```cpp
87   // create_ark_runtime.cpp
88   #include <pthread.h>
89   #include "napi/native_api.h"
90
91   static void *CreateArkRuntimeFunc(void *arg)
92   {
93       // 1. 创建基础运行环境
94       napi_env env;
95       napi_status ret = napi_create_ark_runtime(&env);
96       if (ret != napi_ok) {
97           return nullptr;
98       }
99
100       // 2. 加载自定义模块
101       napi_value objUtils;
102       ret = napi_load_module_with_info(env, "entry/src/main/ets/pages/ObjectUtils", "com.example.myapplication/entry", &objUtils);
103       if (ret != napi_ok) {
104           return nullptr;
105       }
106
107       // 3. 使用ArkTS中的logger
108       napi_value logger;
109       ret = napi_get_named_property(env, objUtils, "Logger", &logger);
110       if (ret != napi_ok) {
111           return nullptr;
112       }
113       ret = napi_call_function(env, objUtils, logger, 0, nullptr, nullptr);
114
115       // 4. 销毁ArkTS环境
116       ret = napi_destroy_ark_runtime(&env);
117       return nullptr;
118   }
119
120   static napi_value CreateArkRuntime(napi_env env, napi_callback_info info)
121   {
122       pthread_t tid;
123       pthread_create(&tid, nullptr, CreateArkRuntimeFunc, nullptr);
124       pthread_join(tid, nullptr);
125       return nullptr;
126   }
127   ```
128
1293. 编写ArkTS侧示例代码。
130
131   ```ts
132   // ObjectUtils.ets
133   export function Logger() {
134       console.log("print log");
135   }
136
137   // ArkTS侧调用接口
138   import testNapi from 'libentry.so';
139
140   testNapi.createArkRuntime();
141   ```
142
143