1#include "cjsonnapi.h" 2/* [NAPI_GEN]:对应cJSON.h中:cJSON_Parse的napi方法, 3 * 输入:value: const char *; 4 * 输出:cJSON * 5 */ 6napi_value KH727_cJSON_Parse(napi_env env, napi_callback_info info) 7{ 8 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH727_cJSON_Parse", "KH727_cJSON_Parse begins"); 9 napi_status status; 10 /* [NAPI_GEN]: Node.js在其N-API中用来提供错误的扩展信息的结构体,结构体包含以下字段 11 * error_message: 一个指向错误详细字符串的指针,提供了关于错误的文本描述 12 * engin_reserved: 一个保留给Js引擎使用的指针 13 * error_code: 错误码,指示了错误的种类,比如napi_pending_exception表示有一个JavaScript异常未被清理。 14 * engine_error_code:一个引擎特定的错误码,为引擎实现保留,具体含义依赖于使用的JavaScript引擎。 15 * error_message_len:错误消息字符串的长度。 16 */ 17 const napi_extended_error_info *extended_error_info; 18 /* [NAPI_GEN]: tag: 日志打印标签*/ 19 const char *tag = "[KH727_cJSON_Parse]"; 20 /* [NAPI_GEN]: get function param in*/ 21 /* [NAPI_GEN]: argc:js传入的参数个数 */ 22 size_t argc = PARAMS1; 23 /* [NAPI_GEN]: args: 一个数组,保存js传入的参数 */ 24 napi_value args[PARAMS1] = {nullptr}; 25 /* [NAPI_GEN]: napi_get_cb_info用于获取JS调用该函数时所传递的参数、接收参数的个数以及'this'的值 26 * env: 当前环境的句柄,代表当前的Node.js环境 27 * info: 回调信息句柄,代表当前回调的上下文 28 * argc: 指向size_t的指针,最初应包含可接受的最大参数数量,函数返回时,它将包含实际传递的参数数量 29 * args: 一个足够大的数组,用于接收传递给回调函数的所有js参数。数组的大小应至少与argc传入的值一样大。 30 * this_arg: 如果不是NULL,则返回js回调中this的值 31 * data: 如果不是NULL,则返回与回调函数关联的任何可选数据。通常用于传递在创建函数时指定的静态数据 32 */ 33 status = napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 34 if(status != napi_ok) { 35 /* [NAPI_GEN]: 错误处理*/ 36 getErrMessage(status, env,extended_error_info, "napi_get_cb_info", tag); 37 return nullptr; 38 } 39 /* [NAPI_GEN]: 从args数组中获取入参 */ 40 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH727_cJSON_Parse", "KH727_cJSON_Parse get param info begins"); 41 napi_valuetype valuetypevalue; 42 /* [NAPI_GEN]: 获取入参类型,第PARAMS0个入参 43 * env: N-API环境的句柄,表示当前的上下文 44 * value: 要检查类型的js值 45 * result: 是一个指针,指向napi_valuetype枚举的值,函数会将结果存储在这里 46 */ 47 status = napi_typeof(env, args[PARAMS0], &valuetypevalue); 48 if (status != napi_ok) { 49 getErrMessage(status, env, extended_error_info, "napi_typeof", tag); 50 return nullptr; 51 } 52 size_t strSizePARAMS0 = 0; 53 /* [NAPI_GEN]: napi_get_value_string_utf8用于将Js字符串转换为UTF-8编码的C字符串 54 * env: N-API环境的句柄,表示当前的上下文 55 * value: 要转换的JavaScript字符串 56 * buf: 用于存储结果的字符数组的指针 57 * bufsize: 缓冲区大小,以字节为单位 58 * result: 转换后的字符串的字节长度(不包括空终止符)。若干buf是NULL,则返回所需的缓冲区大小(包括空终止符) 59 */ 60 /* [NAPI_GEN]: buf参数是NULL时,用于获取所需缓冲区大小*/ 61 status = napi_get_value_string_utf8(env, args[PARAMS0], NULL, 0, &strSizePARAMS0); 62 if (status != napi_ok) { 63 getErrMessage(status, env, extended_error_info, "get value string", tag); 64 return nullptr; 65 } 66 char *valueIn = new char[strSizePARAMS0 + 1]; 67 /* [NAPI_GEN]: 用于获取字符串*/ 68 status = napi_get_value_string_utf8(env, args[PARAMS0], valueIn, strSizePARAMS0 + 1, &strSizePARAMS0); 69 if (status != napi_ok) { 70 getErrMessage(status, env, extended_error_info, "get value string", tag); 71 delete[] valueIn; 72 return nullptr; 73 } 74 // delete[] valueIn; // remember to delete memory 75 76 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH727_cJSON_Parse", "KH727_cJSON_Parse get param info ends"); 77 78 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH727_cJSON_Parse", "KH727_cJSON_Parse get return info begins"); 79 // Todo: add business logic. 在这前后代码为框架所生成 80 81 /* [NAPI_GEN]: function return value*/ 82 napi_value cJSON_ParseOut; 83 /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互 84 * env: 当前环境的句柄 85 * result: 一个napi_value的指针,该指针将被设置为新创建的js对象 86 */ 87 status = napi_create_object(env, &cJSON_ParseOut); 88 if (status != napi_ok) { 89 getErrMessage(status, env, extended_error_info, "napi_create_object", tag); 90 return nullptr; 91 } 92 napi_value nextOut; 93 /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互 94 * env: 当前环境的句柄 95 * result: 一个napi_value的指针,该指针将被设置为新创建的js对象 96 */ 97 status = napi_create_object(env, &nextOut); 98 if (status != napi_ok) { 99 getErrMessage(status, env, extended_error_info, "napi_create_object", tag); 100 return nullptr; 101 } 102 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js 103 * env: 当前环境的句柄 104 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的 105 * utf8name: 属性的名称,是一个以UTF-8编码的字符串 106 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等) 107 */ 108 status = napi_set_named_property(env, cJSON_ParseOut, "next", nextOut); 109 if (status != napi_ok) { 110 /* [NAPI_GEN]: 错误处理*/ 111 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag); 112 return nullptr; 113 } 114 napi_value prevOut; 115 /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互 116 * env: 当前环境的句柄 117 * result: 一个napi_value的指针,该指针将被设置为新创建的js对象 118 */ 119 status = napi_create_object(env, &prevOut); 120 if (status != napi_ok) { 121 getErrMessage(status, env, extended_error_info, "napi_create_object", tag); 122 return nullptr; 123 } 124 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js 125 * env: 当前环境的句柄 126 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的 127 * utf8name: 属性的名称,是一个以UTF-8编码的字符串 128 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等) 129 */ 130 status = napi_set_named_property(env, cJSON_ParseOut, "prev", prevOut); 131 if (status != napi_ok) { 132 /* [NAPI_GEN]: 错误处理*/ 133 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag); 134 return nullptr; 135 } 136 napi_value childOut; 137 /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互 138 * env: 当前环境的句柄 139 * result: 一个napi_value的指针,该指针将被设置为新创建的js对象 140 */ 141 status = napi_create_object(env, &childOut); 142 if (status != napi_ok) { 143 getErrMessage(status, env, extended_error_info, "napi_create_object", tag); 144 return nullptr; 145 } 146 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js 147 * env: 当前环境的句柄 148 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的 149 * utf8name: 属性的名称,是一个以UTF-8编码的字符串 150 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等) 151 */ 152 status = napi_set_named_property(env, cJSON_ParseOut, "child", childOut); 153 if (status != napi_ok) { 154 /* [NAPI_GEN]: 错误处理*/ 155 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag); 156 return nullptr; 157 } 158 napi_value typeOut; 159 /* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象 160 * env: 当前环境的句柄 161 * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改 162 * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象 163 */ 164 status = napi_create_int32(env, 1, &typeOut); 165 if (status != napi_ok) { 166 getErrMessage(status, env, extended_error_info, "napi_create_int32", tag); 167 return nullptr; 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_ParseOut, "type", typeOut); 176 if (status != napi_ok) { 177 /* [NAPI_GEN]: 错误处理*/ 178 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag); 179 return nullptr; 180 } 181 napi_value valuestringOut; 182 /* [NAPI_GEN]: 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个等价的js字符串 183 * env: 当前环境的句柄 184 * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以valuestring举例,用户可根据需求修改 185 * length: 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾) 186 * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串 187 */ 188 status = napi_create_string_utf8(env, "valuestring", NAPI_AUTO_LENGTH, &valuestringOut); 189 if (status != napi_ok) { 190 /*错误处理*/ 191 getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag); 192 return nullptr; 193 } 194 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js 195 * env: 当前环境的句柄 196 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的 197 * utf8name: 属性的名称,是一个以UTF-8编码的字符串 198 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等) 199 */ 200 status = napi_set_named_property(env, cJSON_ParseOut, "valuestring", valuestringOut); 201 if (status != napi_ok) { 202 /* [NAPI_GEN]: 错误处理*/ 203 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag); 204 return nullptr; 205 } 206 napi_value valueintOut; 207 /* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象 208 * env: 当前环境的句柄 209 * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改 210 * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象 211 */ 212 status = napi_create_int32(env, 1, &valueintOut); 213 if (status != napi_ok) { 214 getErrMessage(status, env, extended_error_info, "napi_create_int32", tag); 215 return nullptr; 216 } 217 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js 218 * env: 当前环境的句柄 219 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的 220 * utf8name: 属性的名称,是一个以UTF-8编码的字符串 221 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等) 222 */ 223 status = napi_set_named_property(env, cJSON_ParseOut, "valueint", valueintOut); 224 if (status != napi_ok) { 225 /* [NAPI_GEN]: 错误处理*/ 226 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag); 227 return nullptr; 228 } 229 napi_value valuedoubleOut; 230 /* [NAPI_GEN]: 返回值是double类型时,napi_create_double 创建一个包含双精度浮点数的js数值(Number)对象 231 * env: 当前环境的句柄 232 * value: 要传递给js的双精度浮点数值,这里以传入1.0为例,用例新增业务代码时可根据自身需求修改 233 * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象 234 */ 235 status = napi_create_double(env, 1.0, &valuedoubleOut); 236 if (status != napi_ok) { 237 getErrMessage(status, env, extended_error_info, "napi_create_double", tag); 238 return nullptr; 239 } 240 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js 241 * env: 当前环境的句柄 242 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的 243 * utf8name: 属性的名称,是一个以UTF-8编码的字符串 244 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等) 245 */ 246 status = napi_set_named_property(env, cJSON_ParseOut, "valuedouble", valuedoubleOut); 247 if (status != napi_ok) { 248 /* [NAPI_GEN]: 错误处理*/ 249 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag); 250 return nullptr; 251 } 252 napi_value stringOut; 253 /* [NAPI_GEN]: 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个等价的js字符串 254 * env: 当前环境的句柄 255 * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以string举例,用户可根据需求修改 256 * length: 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾) 257 * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串 258 */ 259 status = napi_create_string_utf8(env, "string", NAPI_AUTO_LENGTH, &stringOut); 260 if (status != napi_ok) { 261 /*错误处理*/ 262 getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag); 263 return nullptr; 264 } 265 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js 266 * env: 当前环境的句柄 267 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的 268 * utf8name: 属性的名称,是一个以UTF-8编码的字符串 269 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等) 270 */ 271 status = napi_set_named_property(env, cJSON_ParseOut, "string", stringOut); 272 if (status != napi_ok) { 273 /* [NAPI_GEN]: 错误处理*/ 274 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag); 275 return nullptr; 276 } 277 278 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH727_cJSON_Parse", "KH727_cJSON_Parse get return info ends"); 279 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH727_cJSON_Parse", "KH727_cJSON_Parse ends"); 280 return cJSON_ParseOut; 281 282} 283