1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "napi/native_api.h"
17
18 // [Start napi_create_queue_async_work]
19 static constexpr int INT_ARGS_2 = 2; // 入参索引
20
21 struct CallbackData {
22 napi_async_work asyncWork = nullptr;
23 napi_ref callbackRef = nullptr;
24 double args[2] = {0};
25 double result = 0;
26 };
27
28 // [StartExclude napi_create_queue_async_work]
29 // [Start napi_async_first_call_back_work]
ExecuteCB(napi_env env,void * data)30 static void ExecuteCB(napi_env env, void *data)
31 {
32 CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);
33 callbackData->result = callbackData->args[0] + callbackData->args[1];
34 }
35 // [End napi_async_first_call_back_work]
36
37 // [Start napi_async_second_call_back_work]
CompleteCB(napi_env env,napi_status status,void * data)38 static void CompleteCB(napi_env env, napi_status status, void *data)
39 {
40 CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);
41 napi_value callbackArg[1] = {nullptr};
42 napi_create_double(env, callbackData->result, &callbackArg[0]);
43 napi_value callback = nullptr;
44 napi_get_reference_value(env, callbackData->callbackRef, &callback);
45 // 执行回调函数
46 napi_value result;
47 napi_value undefined;
48 napi_get_undefined(env, &undefined);
49 napi_call_function(env, undefined, callback, 1, callbackArg, &result);
50 // 删除napi_ref对象以及异步任务
51 napi_delete_reference(env, callbackData->callbackRef);
52 napi_delete_async_work(env, callbackData->asyncWork);
53 delete callbackData;
54 }
55 // [End napi_async_second_call_back_work]
56 // [EndExclude napi_create_queue_async_work]
57
AsyncWork(napi_env env,napi_callback_info info)58 napi_value AsyncWork(napi_env env, napi_callback_info info)
59 {
60 size_t argc = 3;
61 napi_value args[3];
62 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
63 auto asyncContext = new CallbackData();
64 // 将接收到的参数保存到callbackData
65 napi_get_value_double(env, args[0], &asyncContext->args[0]);
66 napi_get_value_double(env, args[1], &asyncContext->args[1]);
67 // 将传入的callback转换为napi_ref延长其生命周期,防止被GC掉
68 napi_create_reference(env, args[INT_ARGS_2], 1, &asyncContext->callbackRef);
69 napi_value resourceName = nullptr;
70 napi_create_string_utf8(env, "asyncWorkCallback", NAPI_AUTO_LENGTH, &resourceName);
71 // 创建异步任务
72 napi_create_async_work(env, nullptr, resourceName, ExecuteCB, CompleteCB,
73 asyncContext, &asyncContext->asyncWork);
74 // 将异步任务加入队列
75 napi_queue_async_work(env, asyncContext->asyncWork);
76 return nullptr;
77 }
78 // [End napi_create_queue_async_work]
79
80 // [Start napi_value_init]
81 // 模块初始化
Init(napi_env env,napi_value exports)82 static napi_value Init(napi_env env, napi_value exports)
83 {
84 napi_property_descriptor desc[] = {
85 { "asyncWork", nullptr, AsyncWork, nullptr, nullptr, nullptr, napi_default, nullptr }
86 };
87 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
88 return exports;
89 }
90 // [End napi_value_init]
91
92 static napi_module demoModule = {
93 .nm_version = 1,
94 .nm_flags = 0,
95 .nm_filename = nullptr,
96 .nm_register_func = Init,
97 .nm_modname = "entry1",
98 .nm_priv = ((void*)0),
99 .reserved = { 0 },
100 };
101
RegisterEntryModule(void)102 extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
103 {
104 napi_module_register(&demoModule);
105 }