1#include "cjsonnapi.h" 2/* [NAPI_GEN]:对应cJSON.h中:cJSON_CreateObject的napi方法, 3 * 输入:void 4 * 输出:cJSON * 5 */ 6napi_value KH578_cJSON_CreateObject(napi_env env, napi_callback_info info) 7{ 8 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH578_cJSON_CreateObject", "KH578_cJSON_CreateObject 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 = "[KH578_cJSON_CreateObject]"; 20 /* [NAPI_GEN]: get function param in*/ 21 22 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH578_cJSON_CreateObject", "KH578_cJSON_CreateObject get return info begins"); 23 // Todo: add business logic. 在这前后代码为框架所生成 24 25 /* [NAPI_GEN]: function return value*/ 26 napi_value cJSON_CreateObjectOut; 27 /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互 28 * env: 当前环境的句柄 29 * result: 一个napi_value的指针,该指针将被设置为新创建的js对象 30 */ 31 status = napi_create_object(env, &cJSON_CreateObjectOut); 32 if (status != napi_ok) { 33 getErrMessage(status, env, extended_error_info, "napi_create_object", tag); 34 return nullptr; 35 } 36 napi_value nextOut; 37 /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互 38 * env: 当前环境的句柄 39 * result: 一个napi_value的指针,该指针将被设置为新创建的js对象 40 */ 41 status = napi_create_object(env, &nextOut); 42 if (status != napi_ok) { 43 getErrMessage(status, env, extended_error_info, "napi_create_object", tag); 44 return nullptr; 45 } 46 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js 47 * env: 当前环境的句柄 48 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的 49 * utf8name: 属性的名称,是一个以UTF-8编码的字符串 50 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等) 51 */ 52 status = napi_set_named_property(env, cJSON_CreateObjectOut, "next", nextOut); 53 if (status != napi_ok) { 54 /* [NAPI_GEN]: 错误处理*/ 55 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag); 56 return nullptr; 57 } 58 napi_value prevOut; 59 /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互 60 * env: 当前环境的句柄 61 * result: 一个napi_value的指针,该指针将被设置为新创建的js对象 62 */ 63 status = napi_create_object(env, &prevOut); 64 if (status != napi_ok) { 65 getErrMessage(status, env, extended_error_info, "napi_create_object", tag); 66 return nullptr; 67 } 68 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js 69 * env: 当前环境的句柄 70 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的 71 * utf8name: 属性的名称,是一个以UTF-8编码的字符串 72 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等) 73 */ 74 status = napi_set_named_property(env, cJSON_CreateObjectOut, "prev", prevOut); 75 if (status != napi_ok) { 76 /* [NAPI_GEN]: 错误处理*/ 77 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag); 78 return nullptr; 79 } 80 napi_value childOut; 81 /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互 82 * env: 当前环境的句柄 83 * result: 一个napi_value的指针,该指针将被设置为新创建的js对象 84 */ 85 status = napi_create_object(env, &childOut); 86 if (status != napi_ok) { 87 getErrMessage(status, env, extended_error_info, "napi_create_object", tag); 88 return nullptr; 89 } 90 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js 91 * env: 当前环境的句柄 92 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的 93 * utf8name: 属性的名称,是一个以UTF-8编码的字符串 94 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等) 95 */ 96 status = napi_set_named_property(env, cJSON_CreateObjectOut, "child", childOut); 97 if (status != napi_ok) { 98 /* [NAPI_GEN]: 错误处理*/ 99 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag); 100 return nullptr; 101 } 102 napi_value typeOut; 103 /* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象 104 * env: 当前环境的句柄 105 * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改 106 * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象 107 */ 108 status = napi_create_int32(env, 1, &typeOut); 109 if (status != napi_ok) { 110 getErrMessage(status, env, extended_error_info, "napi_create_int32", tag); 111 return nullptr; 112 } 113 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js 114 * env: 当前环境的句柄 115 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的 116 * utf8name: 属性的名称,是一个以UTF-8编码的字符串 117 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等) 118 */ 119 status = napi_set_named_property(env, cJSON_CreateObjectOut, "type", typeOut); 120 if (status != napi_ok) { 121 /* [NAPI_GEN]: 错误处理*/ 122 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag); 123 return nullptr; 124 } 125 napi_value valuestringOut; 126 /* [NAPI_GEN]: 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个等价的js字符串 127 * env: 当前环境的句柄 128 * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以valuestring举例,用户可根据需求修改 129 * length: 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾) 130 * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串 131 */ 132 status = napi_create_string_utf8(env, "valuestring", NAPI_AUTO_LENGTH, &valuestringOut); 133 if (status != napi_ok) { 134 /*错误处理*/ 135 getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag); 136 return nullptr; 137 } 138 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js 139 * env: 当前环境的句柄 140 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的 141 * utf8name: 属性的名称,是一个以UTF-8编码的字符串 142 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等) 143 */ 144 status = napi_set_named_property(env, cJSON_CreateObjectOut, "valuestring", valuestringOut); 145 if (status != napi_ok) { 146 /* [NAPI_GEN]: 错误处理*/ 147 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag); 148 return nullptr; 149 } 150 napi_value valueintOut; 151 /* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象 152 * env: 当前环境的句柄 153 * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改 154 * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象 155 */ 156 status = napi_create_int32(env, 1, &valueintOut); 157 if (status != napi_ok) { 158 getErrMessage(status, env, extended_error_info, "napi_create_int32", tag); 159 return nullptr; 160 } 161 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js 162 * env: 当前环境的句柄 163 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的 164 * utf8name: 属性的名称,是一个以UTF-8编码的字符串 165 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等) 166 */ 167 status = napi_set_named_property(env, cJSON_CreateObjectOut, "valueint", valueintOut); 168 if (status != napi_ok) { 169 /* [NAPI_GEN]: 错误处理*/ 170 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag); 171 return nullptr; 172 } 173 napi_value valuedoubleOut; 174 /* [NAPI_GEN]: 返回值是double类型时,napi_create_double 创建一个包含双精度浮点数的js数值(Number)对象 175 * env: 当前环境的句柄 176 * value: 要传递给js的双精度浮点数值,这里以传入1.0为例,用例新增业务代码时可根据自身需求修改 177 * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象 178 */ 179 status = napi_create_double(env, 1.0, &valuedoubleOut); 180 if (status != napi_ok) { 181 getErrMessage(status, env, extended_error_info, "napi_create_double", tag); 182 return nullptr; 183 } 184 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js 185 * env: 当前环境的句柄 186 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的 187 * utf8name: 属性的名称,是一个以UTF-8编码的字符串 188 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等) 189 */ 190 status = napi_set_named_property(env, cJSON_CreateObjectOut, "valuedouble", valuedoubleOut); 191 if (status != napi_ok) { 192 /* [NAPI_GEN]: 错误处理*/ 193 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag); 194 return nullptr; 195 } 196 napi_value stringOut; 197 /* [NAPI_GEN]: 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个等价的js字符串 198 * env: 当前环境的句柄 199 * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以string举例,用户可根据需求修改 200 * length: 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾) 201 * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串 202 */ 203 status = napi_create_string_utf8(env, "string", NAPI_AUTO_LENGTH, &stringOut); 204 if (status != napi_ok) { 205 /*错误处理*/ 206 getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag); 207 return nullptr; 208 } 209 /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js 210 * env: 当前环境的句柄 211 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的 212 * utf8name: 属性的名称,是一个以UTF-8编码的字符串 213 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等) 214 */ 215 status = napi_set_named_property(env, cJSON_CreateObjectOut, "string", stringOut); 216 if (status != napi_ok) { 217 /* [NAPI_GEN]: 错误处理*/ 218 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag); 219 return nullptr; 220 } 221 222 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH578_cJSON_CreateObject", "KH578_cJSON_CreateObject get return info ends"); 223 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH578_cJSON_CreateObject", "KH578_cJSON_CreateObject ends"); 224 return cJSON_CreateObjectOut; 225 226} 227