1 /*
2 * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development 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 "cJsonNapiH/cjsonnapi.h"
17 #include <bits/alltypes.h>
18
getCreateintarrTypeOut(napi_env env,napi_value cJSON_CreateIntArrayOut,cJSON * jsonObj)19 napi_value getCreateintarrTypeOut(napi_env env, napi_value cJSON_CreateIntArrayOut, cJSON *jsonObj)
20 {
21 napi_status status;
22 const napi_extended_error_info *extended_error_info;
23 const char *tag = "[KH203_cJSON_CreateIntArray]";
24 napi_value typeOut;
25 /* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象
26 * env: 当前环境的句柄
27 * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改
28 * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
29 */
30 status = napi_create_int32(env, jsonObj == NULL ? 0 : jsonObj->type, &typeOut);
31 if (status != napi_ok) {
32 getErrMessage(status, env, extended_error_info, "napi_create_int32", tag);
33 return NULL;
34 }
35 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
36 * env: 当前环境的句柄
37 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
38 * utf8name: 属性的名称,是一个以UTF-8编码的字符串
39 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
40 */
41 status = napi_set_named_property(env, cJSON_CreateIntArrayOut, "type", typeOut);
42 if (status != napi_ok) {
43 /* [NAPI_GEN]: 错误处理*/
44 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
45 return NULL;
46 }
47 return cJSON_CreateIntArrayOut;
48 }
49
getCreateintarrValuesintOut(napi_env env,napi_value cJSON_CreateIntArrayOut,cJSON * jsonObj)50 napi_value getCreateintarrValuesintOut(napi_env env, napi_value cJSON_CreateIntArrayOut, cJSON *jsonObj)
51 {
52 napi_status status;
53 const napi_extended_error_info *extended_error_info;
54 const char *tag = "[KH203_cJSON_CreateIntArray]";
55 napi_value valueintOut;
56 /* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象
57 * env: 当前环境的句柄
58 * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改
59 * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
60 */
61 status = napi_create_int32(env, jsonObj == NULL ? 0 : jsonObj->valueint, &valueintOut);
62 if (status != napi_ok) {
63 getErrMessage(status, env, extended_error_info, "napi_create_int32", tag);
64 return NULL;
65 }
66 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
67 * env: 当前环境的句柄
68 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
69 * utf8name: 属性的名称,是一个以UTF-8编码的字符串
70 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
71 */
72 status = napi_set_named_property(env, cJSON_CreateIntArrayOut, "valueint", valueintOut);
73 if (status != napi_ok) {
74 /* [NAPI_GEN]: 错误处理*/
75 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
76 return NULL;
77 }
78 return cJSON_CreateIntArrayOut;
79 }
80
getCreateintarrValuesdoubleOut(napi_env env,napi_value cJSON_CreateIntArrayOut,cJSON * jsonObj)81 napi_value getCreateintarrValuesdoubleOut(napi_env env, napi_value cJSON_CreateIntArrayOut, cJSON *jsonObj)
82 {
83 napi_status status;
84 const napi_extended_error_info *extended_error_info;
85 const char *tag = "[KH203_cJSON_CreateIntArray]";
86 napi_value valuedoubleOut;
87 /* [NAPI_GEN]: 返回值是double类型时,napi_create_double 创建一个包含双精度浮点数的js数值(Number)对象
88 * env: 当前环境的句柄
89 * value: 要传递给js的双精度浮点数值,这里以传入1.0为例,用例新增业务代码时可根据自身需求修改
90 * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
91 */
92 status = napi_create_double(env, jsonObj == NULL ? 0 : jsonObj->valuedouble, &valuedoubleOut);
93 if (status != napi_ok) {
94 getErrMessage(status, env, extended_error_info, "napi_create_double", tag);
95 return NULL;
96 }
97 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
98 * env: 当前环境的句柄
99 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
100 * utf8name: 属性的名称,是一个以UTF-8编码的字符串
101 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
102 */
103 status = napi_set_named_property(env, cJSON_CreateIntArrayOut, "valuedouble", valuedoubleOut);
104 if (status != napi_ok) {
105 /* [NAPI_GEN]: 错误处理*/
106 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
107 return NULL;
108 }
109 return cJSON_CreateIntArrayOut;
110 }
111
getCreateintarrValuestringOut(napi_env env,napi_value cJSON_CreateIntArrayOut,cJSON * jsonOut)112 napi_value getCreateintarrValuestringOut(napi_env env, napi_value cJSON_CreateIntArrayOut, cJSON *jsonOut)
113 {
114 napi_status status;
115 const napi_extended_error_info *extended_error_info;
116 const char *tag = "[KH203_cJSON_CreateIntArray]";
117 napi_value valuestringOut;
118 /* [NAPI_GEN]:
119 * 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个等价的js字符串
120 * env: 当前环境的句柄
121 * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以valuestring举例,用户可根据需求修改
122 * length:
123 * 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾)
124 * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串
125 */
126 status = napi_create_string_utf8(env, jsonOut->valuestring == nullptr ? "" : jsonOut->valuestring, NAPI_AUTO_LENGTH,
127 &valuestringOut);
128 if (status != napi_ok) {
129 /*错误处理*/
130 getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag);
131 return NULL;
132 }
133 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
134 * env: 当前环境的句柄
135 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
136 * utf8name: 属性的名称,是一个以UTF-8编码的字符串
137 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
138 */
139 status = napi_set_named_property(env, cJSON_CreateIntArrayOut, "valuestring", valuestringOut);
140 if (status != napi_ok) {
141 /* [NAPI_GEN]: 错误处理*/
142 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
143 return NULL;
144 }
145 return cJSON_CreateIntArrayOut;
146 }
147
getCreateintarrStringOut(napi_env env,napi_value cJSON_CreateIntArrayOut,cJSON * jsonOut)148 napi_value getCreateintarrStringOut(napi_env env, napi_value cJSON_CreateIntArrayOut, cJSON *jsonOut)
149 {
150 napi_status status;
151 const napi_extended_error_info *extended_error_info;
152 const char *tag = "[KH203_cJSON_CreateIntArray]";
153 napi_value stringOut;
154 /* [NAPI_GEN]:
155 * 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个等价的js字符串
156 * env: 当前环境的句柄
157 * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以string举例,用户可根据需求修改
158 * length:
159 * 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾)
160 * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串
161 */
162 status =
163 napi_create_string_utf8(env, jsonOut->string == nullptr ? "" : jsonOut->string, NAPI_AUTO_LENGTH, &stringOut);
164 if (status != napi_ok) {
165 /*错误处理*/
166 getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag);
167 return NULL;
168 }
169 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
170 * env: 当前环境的句柄
171 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
172 * utf8name: 属性的名称,是一个以UTF-8编码的字符串
173 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
174 */
175 status = napi_set_named_property(env, cJSON_CreateIntArrayOut, "string", stringOut);
176 if (status != napi_ok) {
177 /* [NAPI_GEN]: 错误处理*/
178 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
179 return NULL;
180 }
181 return cJSON_CreateIntArrayOut;
182 }
183
getCreateintarrNextOut(napi_env env,napi_value cJSON_CreateIntArrayOut,cJSON * jsonObj)184 napi_value getCreateintarrNextOut(napi_env env, napi_value cJSON_CreateIntArrayOut, cJSON *jsonObj)
185 {
186 napi_status status;
187 const napi_extended_error_info *extended_error_info;
188 const char *tag = "[KH203_cJSON_CreateIntArray]";
189 napi_value nextOut;
190 /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
191 * env: 当前环境的句柄
192 * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
193 */
194 status = napi_create_object(env, &nextOut);
195 if (status != napi_ok) {
196 getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
197 return NULL;
198 }
199 // 给jsonObj->next赋值
200 if (jsonObj == NULL) {
201 return NULL;
202 }
203 if (jsonObj->next != NULL) {
204 nextOut = getCreateintarrTypeOut(env, nextOut, jsonObj->next);
205 nextOut = getCreateintarrValuesdoubleOut(env, nextOut, jsonObj->next);
206 nextOut = getCreateintarrValuesintOut(env, nextOut, jsonObj->next);
207 nextOut = getCreateintarrValuestringOut(env, nextOut, jsonObj->next);
208 nextOut = getCreateintarrStringOut(env, nextOut, jsonObj->next);
209 if (jsonObj->next->next != NULL) {
210 cJSON *nextNext = jsonObj->next->next;
211 if (nextNext != NULL) {
212 nextOut = getCreateintarrNextOut(env, nextOut, jsonObj->next);
213 }
214 }
215 }
216 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
217 * env: 当前环境的句柄
218 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
219 * utf8name: 属性的名称,是一个以UTF-8编码的字符串
220 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
221 */
222 status = napi_set_named_property(env, cJSON_CreateIntArrayOut, "next", nextOut);
223 if (status != napi_ok) {
224 /* [NAPI_GEN]: 错误处理*/
225 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
226 return NULL;
227 }
228 return cJSON_CreateIntArrayOut;
229 }
230
getJsonobjitemChildOut(napi_env env,napi_value childOut,cJSON * jsonObj)231 napi_value getJsonobjitemChildOut(napi_env env, napi_value childOut, cJSON *jsonObj)
232 {
233 if (jsonObj->child != NULL) {
234 childOut = getCreateintarrTypeOut(env, childOut, jsonObj->child);
235 childOut = getCreateintarrValuesdoubleOut(env, childOut, jsonObj->child);
236 childOut = getCreateintarrValuesintOut(env, childOut, jsonObj->child);
237 childOut = getCreateintarrValuestringOut(env, childOut, jsonObj->child);
238 childOut = getCreateintarrStringOut(env, childOut, jsonObj->child);
239 if (jsonObj->child->next != NULL) {
240 cJSON *childNext = jsonObj->child->next;
241 if (childNext != NULL) {
242 childOut = getCreateintarrNextOut(env, childOut, jsonObj->child);
243 }
244 }
245 }
246 return childOut;
247 }
248
getCreateintarrChildOut(napi_env env,napi_value cJSON_CreateIntArrayOut,cJSON * jsonObj)249 napi_value getCreateintarrChildOut(napi_env env, napi_value cJSON_CreateIntArrayOut, cJSON *jsonObj)
250 {
251 napi_status status;
252 const napi_extended_error_info *extended_error_info;
253 const char *tag = "[KH203_cJSON_CreateIntArray]";
254 napi_value childOut;
255 /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
256 * env: 当前环境的句柄
257 * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
258 */
259 status = napi_create_object(env, &childOut);
260 if (status != napi_ok) {
261 getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
262 return NULL;
263 }
264 // 给jsonObj->child赋值
265 if (jsonObj != NULL) {
266 childOut = getJsonobjitemChildOut(env, childOut, jsonObj);
267 }
268 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
269 * env: 当前环境的句柄
270 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
271 * utf8name: 属性的名称,是一个以UTF-8编码的字符串
272 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
273 */
274 status = napi_set_named_property(env, cJSON_CreateIntArrayOut, "child", childOut);
275 if (status != napi_ok) {
276 /* [NAPI_GEN]: 错误处理*/
277 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
278 return NULL;
279 }
280 return cJSON_CreateIntArrayOut;
281 }
282
getCreateintarrPrevOut(napi_env env,napi_value cJSON_CreateIntArrayOut,cJSON * jsonObj)283 napi_value getCreateintarrPrevOut(napi_env env, napi_value cJSON_CreateIntArrayOut, cJSON *jsonObj)
284 {
285 napi_status status;
286 const napi_extended_error_info *extended_error_info;
287 const char *tag = "[KH203_cJSON_CreateIntArray]";
288 napi_value prevOut;
289 /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
290 * env: 当前环境的句柄
291 * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
292 */
293 status = napi_create_object(env, &prevOut);
294 if (status != napi_ok) {
295 getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
296 return NULL;
297 }
298 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
299 * env: 当前环境的句柄
300 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
301 * utf8name: 属性的名称,是一个以UTF-8编码的字符串
302 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
303 */
304 status = napi_set_named_property(env, cJSON_CreateIntArrayOut, "prev", prevOut);
305 if (status != napi_ok) {
306 /* [NAPI_GEN]: 错误处理*/
307 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
308 return NULL;
309 }
310 return cJSON_CreateIntArrayOut;
311 }
312
getCjsonObjArrayLen(napi_env env,napi_value param)313 uint32_t getCjsonObjArrayLen(napi_env env, napi_value param)
314 {
315 napi_status status;
316 const napi_extended_error_info *extended_error_info;
317 const char *tag = "[KH203_cJSON_CreateIntArray]";
318 // 确保传递的是一个数组
319 bool isArray = false;
320 status = napi_is_array(env, param, &isArray);
321 if (status != napi_ok) {
322 getErrMessage(status, env, extended_error_info, "napi_is_array", tag);
323 return status;
324 }
325 if (!isArray) {
326 return NULL;
327 }
328 // 获取数组长度
329 uint32_t outerLen = 0;
330 status = napi_get_array_length(env, param, &outerLen);
331 if (status != napi_ok) {
332 getErrMessage(status, env, extended_error_info, "napi_get_array_length", tag);
333 return NULL;
334 }
335 return outerLen;
336 }
337
GetCjsonCreateArrayParams1(napi_env env,napi_value param,int ** outArrayNumbers,uint32_t * outLen)338 napi_status GetCjsonCreateArrayParams1(napi_env env, napi_value param, int **outArrayNumbers, uint32_t *outLen)
339 {
340 napi_status status;
341 const napi_extended_error_info *extended_error_info;
342 const char *tag = "[KH203_cJSON_CreateIntArray]";
343 uint32_t outerLen = getCjsonObjArrayLen(env, param);
344 // 分配内存给输出数组前的校验
345 if (outerLen == 0 || outerLen > (UINT_MAX / sizeof(int))) {
346 // outerLen 为0或者乘以sizeof(int)后超过了最大可分配的内存块大小
347 return napi_generic_failure;
348 }
349 int *tempArrayNumbers = (int *)malloc(sizeof(int) * outerLen);
350 if (tempArrayNumbers == NULL) {
351 // 内存分配失败,处理错误
352 return napi_generic_failure;
353 }
354 // 如果校验和分配都成功,设置输出参数指向新分配的内存
355 *outArrayNumbers = tempArrayNumbers;
356 // 遍历数组
357 for (uint32_t i = 0; i < outerLen; i++) {
358 napi_value v;
359 status = napi_get_element(env, param, i, &v);
360 if (status != napi_ok) {
361 free(*outArrayNumbers);
362 getErrMessage(status, env, extended_error_info, "napi_get_array_length", tag);
363 return status;
364 }
365 // 确保数组中的元素是数字
366 napi_valuetype valuetypeNumber;
367 status = napi_typeof(env, v, &valuetypeNumber);
368 if (status != napi_ok) {
369 free(*outArrayNumbers);
370 getErrMessage(status, env, extended_error_info, "napi_typeof", tag);
371 return status;
372 }
373 if (valuetypeNumber == napi_number) {
374 int32_t num;
375 status = napi_get_value_int32(env, v, &num);
376 if (status != napi_ok) {
377 free(*outArrayNumbers);
378 getErrMessage(status, env, extended_error_info, "napi_get_array_length", tag);
379 return status;
380 }
381 (*outArrayNumbers)[i] = num;
382 } else {
383 free(*outArrayNumbers);
384 OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "KH203_cJSON_CreateIntArray", "get params fail");
385 return napi_number_expected;
386 }
387 }
388 // 设置输出数组长度
389 *outLen = outerLen;
390 return napi_ok;
391 }
392
GetCjsonCreateArrayParams2(napi_env env,napi_value param)393 int32_t GetCjsonCreateArrayParams2(napi_env env, napi_value param)
394 {
395 napi_status status;
396 const napi_extended_error_info *extended_error_info;
397 const char *tag = "[KH203_cJSON_CreateIntArray]";
398
399 napi_valuetype valuetypecount;
400 /* [NAPI_GEN]: 获取入参类型,第1个入参
401 * env: N-API环境的句柄,表示当前的上下文
402 * value: 要检查类型的js值
403 * result: 是一个指针,指向napi_valuetype枚举的值,函数会将结果存储在这里
404 */
405 status = napi_typeof(env, param, &valuetypecount);
406 if (status != napi_ok) {
407 getErrMessage(status, env, extended_error_info, "napi_typeof", tag);
408 return NULL;
409 }
410 int32_t countIn = 0;
411 /* [NAPI_GEN]: napi_get_value_int32将一个 napi_value 类型的 js 数值转换成一个 C 语言的 int32_t 类型的数值
412 * env: N-API环境的句柄,表示当前的上下文
413 * value:要转换的JavaScript值
414 * result:指向 int32_t 类型的指针,在这里函数将存储转换后的整数值
415 */
416 status = napi_get_value_int32(env, param, &countIn);
417 if (status != napi_ok) {
418 /* [NAPI_GEN]: 错误处理*/
419 getErrMessage(status, env, extended_error_info, "napi_get_value_int32", tag);
420 return NULL;
421 }
422 return countIn;
423 }
424
425 /* [NAPI_GEN]:对应cJSON.h中: CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count); 的napi方法
426 * 输入:一个number数组,number数组中元素的数量
427 * 输出:创建的cJSON数组
428 */
KH203_cJSON_CreateIntArray(napi_env env,napi_callback_info info)429 napi_value KH203_cJSON_CreateIntArray(napi_env env, napi_callback_info info)
430 {
431 napi_status status;
432 /* [NAPI_GEN]: Node.js在其N-API中用来提供错误的扩展信息的结构体,结构体包含以下字段
433 * error_message: 一个指向错误详细字符串的指针,提供了关于错误的文本描述
434 * engin_reserved: 一个保留给Js引擎使用的指针
435 * error_code: 错误码,指示了错误的种类,比如napi_pending_exception表示有一个JavaScript异常未被清理。
436 * engine_error_code:一个引擎特定的错误码,为引擎实现保留,具体含义依赖于使用的JavaScript引擎。
437 * error_message_len:错误消息字符串的长度。
438 */
439 const napi_extended_error_info *extended_error_info;
440 /* [NAPI_GEN]: tag: 日志打印标签*/
441 const char *tag = "[KH203_cJSON_CreateIntArray]";
442 /* [NAPI_GEN]: get function param in*/
443 /* [NAPI_GEN]: argc:js传入的参数个数 */
444 size_t argc = PARAMS2;
445 /* [NAPI_GEN]: args: 一个数组,保存js传入的参数 */
446 napi_value args[PARAMS2] = {nullptr};
447 /* [NAPI_GEN]: napi_get_cb_info用于获取JS调用该函数时所传递的参数、接收参数的个数以及'this'的值
448 * env: 当前环境的句柄,代表当前的Node.js环境
449 * info: 回调信息句柄,代表当前回调的上下文
450 * argc: 指向size_t的指针,最初应包含可接受的最大参数数量,函数返回时,它将包含实际传递的参数数量
451 * args: 一个足够大的数组,用于接收传递给回调函数的所有js参数。数组的大小应至少与argc传入的值一样大。
452 * this_arg: 如果不是NULL,则返回js回调中this的值
453 * data: 如果不是NULL,则返回与回调函数关联的任何可选数据。通常用于传递在创建函数时指定的静态数据
454 */
455 status = napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
456 if (status != napi_ok) {
457 /* [NAPI_GEN]: 错误处理*/
458 getErrMessage(status, env, extended_error_info, "napi_get_cb_info", tag);
459 return NULL;
460 }
461
462 int *arrayNumbers = NULL;
463 uint32_t arrayLength = 0;
464 status = GetCjsonCreateArrayParams1(env, args[PARAMS0], &arrayNumbers, &arrayLength);
465 if (status != napi_ok) {
466 getErrMessage(status, env, extended_error_info, "napi_get_cb_info", tag);
467 return NULL;
468 }
469 uint32_t countIn = GetCjsonCreateArrayParams2(env, args[PARAMS1]);
470
471 // Todo: add business logic. 在这前后代码为框架所生成
472 cJSON *arrayRes = NULL;
473 arrayRes = cJSON_CreateIntArray(arrayNumbers, countIn);
474 free(arrayNumbers);
475 // 打印arrayRes2
476 char *arrayString2 = cJSON_Print(arrayRes);
477 if (arrayString2 == NULL) {
478 OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "KH203_cJSON_CreateIntArray", "cJSON_Print failed");
479 cJSON_free(arrayString2); // 释放 cJSON_Print 分配的内存
480 return NULL;
481 } else {
482 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH203_cJSON_CreateIntArray", "arrayString2: %s",
483 arrayString2);
484 cJSON_free(arrayString2); // 释放 cJSON_Print 分配的内存
485 }
486
487 /* [NAPI_GEN]: function return value*/
488 napi_value cJSON_CreateIntArrayOut;
489 /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
490 * env: 当前环境的句柄
491 * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
492 */
493 status = napi_create_object(env, &cJSON_CreateIntArrayOut);
494 if (status != napi_ok) {
495 getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
496 return NULL;
497 }
498
499 cJSON_CreateIntArrayOut = getCreateintarrChildOut(env, cJSON_CreateIntArrayOut, arrayRes);
500 cJSON_CreateIntArrayOut = getCreateintarrNextOut(env, cJSON_CreateIntArrayOut, arrayRes);
501 cJSON_CreateIntArrayOut = getCreateintarrPrevOut(env, cJSON_CreateIntArrayOut, arrayRes);
502 cJSON_CreateIntArrayOut = getCreateintarrTypeOut(env, cJSON_CreateIntArrayOut, arrayRes);
503 cJSON_CreateIntArrayOut = getCreateintarrValuesdoubleOut(env, cJSON_CreateIntArrayOut, arrayRes);
504 cJSON_CreateIntArrayOut = getCreateintarrValuesintOut(env, cJSON_CreateIntArrayOut, arrayRes);
505 cJSON_CreateIntArrayOut = getCreateintarrValuestringOut(env, cJSON_CreateIntArrayOut, arrayRes);
506 cJSON_CreateIntArrayOut = getCreateintarrStringOut(env, cJSON_CreateIntArrayOut, arrayRes);
507
508 return cJSON_CreateIntArrayOut;
509 }
510