• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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