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// h2sa 17export let proxyFuncTemplate = `[retType] [serviceName]Proxy::[funcName]([params]) 18{ 19 int retCode; 20 MessageParcel data, reply; 21 MessageOption option; 22 data.WriteInterfaceToken(GetDescriptor()); 23 [writeData] 24 retCode = Remote()->SendRequest([funcEnum], data, reply, option); 25 retCode = reply.ReadInt32(); 26 if (retCode != ERR_OK) { 27 // Todo 错误处理 28 } 29 30 [readReply] 31}\n\n`; 32 33export let stubInnerFuncTemplate = `ErrCode [serviceName]Stub::[funcName]Inner(MessageParcel &data, MessageParcel &reply) 34{ 35 int retCode = ERR_OK; 36 [readData] 37 [writeReply] 38 return retCode; 39} 40`; 41 42export let serviceFuncImplTemplate = `[retType] [serviceName]Service::[funcName]([params]) 43{ 44 [retType] ret = [initRetvalue]; 45 // TODO: Invoke the business implementation 46 return ret; 47} 48`; 49 50 51// h2hdf 52export let hdiServiceFuncTemplate = `int32_t [marcoName]InterfaceService::[functionName]([params]) 53{ 54 // [hdf-gen] TODO: Invoke the business implementation 55 return HDF_SUCCESS; 56} 57`; 58 59// h2dtscpp 60 61// dts template 62export let dtsFuncTemplate = `/* [NAPI_GEN]:对应[file_introduce_replace]中:[func_introduce_replace]方法的dts接口 63* 输入: [input_introduce_replace] 64* 输出: [func_return_replace] 65*/ 66export const [func_name_replace]:([func_param_replace]) => [func_return_replace]; 67` 68 69// napi方法的初始化 70export let napiFuncInitTemplate = `// [NAPI_GEN]:方法注册后,js方法与native方法映射 71 { "[func_name_replace]" , nullptr, [func_name_replace], nullptr, nullptr, nullptr, napi_default, nullptr }, 72`; 73 74// napi方法定义 75export let napiFuncHTemplate = `/* [NAPI_GEN]:对应[file_introduce_replace]中:[func_name_replace]的napi方法, 76* 输入:[input_introduce_replace] 77* 输出:[func_return_replace] 78*/ 79napi_value [func_name_replace](napi_env env, napi_callback_info info); 80`; 81 82// napi方法体实现 83export let napiFuncCppTemplate = `/* [NAPI_GEN]:对应[file_introduce_replace]中:[func_name_replace]的napi方法, 84* 输入:[input_introduce_replace] 85* 输出:[output_introduce_replace] 86*/ 87napi_value [func_name_replace](napi_env env, napi_callback_info info) 88{ 89 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "[func_name_replace]", "[func_name_replace] begins"); 90 napi_status status; 91 /* [NAPI_GEN]: Node.js在其N-API中用来提供错误的扩展信息的结构体,结构体包含以下字段 92 * error_message: 一个指向错误详细字符串的指针,提供了关于错误的文本描述 93 * engin_reserved: 一个保留给Js引擎使用的指针 94 * error_code: 错误码,指示了错误的种类,比如napi_pending_exception表示有一个JavaScript异常未被清理。 95 * engine_error_code:一个引擎特定的错误码,为引擎实现保留,具体含义依赖于使用的JavaScript引擎。 96 * error_message_len:错误消息字符串的长度。 97 */ 98 const napi_extended_error_info *extended_error_info; 99 /* [NAPI_GEN]: tag: 日志打印标签*/ 100 const char *tag = "[[get_error_msg_tag]]"; 101 /* [NAPI_GEN]: get function param in*/ 102 [func_getParam_replace] 103 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "[func_name_replace]", "[func_name_replace] get return info begins"); 104 [func_return_replace] 105} 106 107`; 108 109// napi方法返回值处理 110export let napiFuncRetTemplate = ` // Todo: add business logic. 在这前后代码为框架所生成 111 112 /* [NAPI_GEN]: function return value*/ 113 [return_replace] 114 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "[func_name_replace]", "[func_name_replace] get return info ends"); 115 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "[func_name_replace]", "[func_name_replace] ends"); 116 return [return_name]Out; 117`; 118 119// napi方法返回值各种类型模板 120export let uint32tRet = ` napi_value [return_name_replace]Out; 121 /* [NAPI_GEN]: 返回值是uint32_t类型时,napi_create_uint32创建一个包含32位无符号整数(uint32_t)的js数值对象 122 * env: 当前环境的句柄 123 * value: 要转换成js数值的uint32_t值,这里以传入1为例,用例新增业务代码时可根据自身需求修改 124 * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js数值对象 125 */ 126 status = napi_create_uint32(env, 1, &[return_name_replace]Out); 127 if (status != napi_ok) { 128 /*错误处理*/ 129 getErrMessage(status, env, extended_error_info, "napi_create_uint32", tag); 130 return nullptr; 131 } 132`; 133 134export let stringRet = ` napi_value [return_name_replace]Out; 135 /* [NAPI_GEN]: 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个等价的js字符串 136 * env: 当前环境的句柄 137 * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以"[return_name_replace]"举例,用户可根据需求修改 138 * length: 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾) 139 * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串 140 */ 141 status = napi_create_string_utf8(env, "[return_name_replace]", NAPI_AUTO_LENGTH, &[return_name_replace]Out); 142 if (status != napi_ok) { 143 /*错误处理*/ 144 getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag); 145 return nullptr; 146 } 147`; 148 149export let stringRetUtf16 = ` napi_value [return_name_replace]Out; 150 /* [NAPI_GEN]: 返回值是字符串时,napi_create_string_utf16用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-16编码的字符串创建一个等价的js字符串 151 * env: 当前环境的句柄 152 * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以"[return_name_replace]"举例,用户可根据需求修改 153 * length: 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾) 154 * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串 155 */ 156 status = napi_create_string_utf16(env, u"[return_name_replace]", NAPI_AUTO_LENGTH, &[return_name_replace]Out); 157 if (status != napi_ok) { 158 /*错误处理*/ 159 getErrMessage(status, env, extended_error_info, "napi_create_string_utf16", tag); 160 return nullptr; 161 } 162`; 163 164export let int64tRet = ` napi_value [return_name_replace]Out; 165 /* [NAPI_GEN]: 返回值是int64类型时,napi_create_int64创建一个包含64位整数(int64_t)的js数值对象 166 * env: 当前环境的句柄 167 * value: 要转换成js数值的int64_t值,这里以传入1为例,用例新增业务代码时可根据自身需求修改 168 * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js数值对象 169 */ 170 status = napi_create_int64(env, 1, &[return_name_replace]Out); 171 if (status != napi_ok) { 172 getErrMessage(status, env, extended_error_info, "napi_create_int64", tag); 173 return nullptr; 174 } 175`; 176 177export let int32tRet = ` napi_value [return_name_replace]Out; 178 /* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象 179 * env: 当前环境的句柄 180 * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改 181 * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象 182 */ 183 status = napi_create_int32(env, 1, &[return_name_replace]Out); 184 if (status != napi_ok) { 185 getErrMessage(status, env, extended_error_info, "napi_create_int32", tag); 186 return nullptr; 187 } 188`; 189 190export let doubleRet = ` napi_value [return_name_replace]Out; 191 /* [NAPI_GEN]: 返回值是double类型时,napi_create_double 创建一个包含双精度浮点数的js数值(Number)对象 192 * env: 当前环境的句柄 193 * value: 要传递给js的双精度浮点数值,这里以传入1.0为例,用例新增业务代码时可根据自身需求修改 194 * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象 195 */ 196 status = napi_create_double(env, 1.0, &[return_name_replace]Out); 197 if (status != napi_ok) { 198 getErrMessage(status, env, extended_error_info, "napi_create_double", tag); 199 return nullptr; 200 } 201`; 202 203export let boolRet = ` napi_value [return_name_replace]Out; 204 /* [NAPI_GEN]: 返回值是bool类型时,napi_get_boolean创建一个表示布尔值的js Boolean对象 205 * env: 当前环境的句柄 206 * value: 希望表示的布尔值(C中的true或者false),这里以传入true为例,用例新增业务代码时可根据自身需求修改 207 * result: 函数返回一个napi_value,它是对应于js Boolean对象的C语言表示 208 */ 209 status = napi_get_boolean(env, true, &[return_name_replace]Out); 210 if (status != napi_ok) { 211 getErrMessage(status, env, extended_error_info, "napi_get_boolean", tag); 212 return nullptr; 213 } 214`; 215 216export let objectRet = ` napi_value [return_name_replace]Out; 217 /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互 218 * env: 当前环境的句柄 219 * result: 一个napi_value的指针,该指针将被设置为新创建的js对象 220 */ 221 status = napi_create_object(env, &[return_name_replace]Out); 222 if (status != napi_ok) { 223 getErrMessage(status, env, extended_error_info, "napi_create_object", tag); 224 return nullptr; 225 } 226`; 227 228export let objectTosetRet = ` /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js 229 * env: 当前环境的句柄 230 * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的 231 * utf8name: 属性的名称,是一个以UTF-8编码的字符串 232 * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等) 233 */ 234 status = napi_set_named_property(env, [set_objname_replace]Out, "[set_propname_replace]", [set_propvalue_replace]Out); 235 if (status != napi_ok) { 236 /* [NAPI_GEN]: 错误处理*/ 237 getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag); 238 return nullptr; 239 } 240`; 241 242export let promiseRet = ` napi_value [return_name_replace]Out; 243 napi_deferred [return_name_replace]DeferedOut; 244 /* [NAPI_GEN]: 创建一个空的promise对象 245 * env: N-API环境的句柄,表示当前的上下文 246 * promise: 用于接收创建的promise对象的指针 247 * deferred: 用于接收deferred对象的指针 248 */ 249 status = napi_create_promise(env, &[return_name_replace]Out, &[return_name_replace]DeferedOut); 250 if (status != napi_ok) { 251 /* [NAPI_GEN]: 错误处理*/ 252 getErrMessage(status, env, extended_error_info, "napi_create_promise", tag); 253 return nullptr; 254 } 255 // Todo: create async work here. 256`; 257 258 259// napi func的paramGen template 260export let paramGenTemplate = ` napi_valuetype valuetype[param_name_replace]; 261 /* [NAPI_GEN]: 获取入参类型,第[param_index_replace]个入参 262 * env: N-API环境的句柄,表示当前的上下文 263 * value: 要检查类型的js值 264 * result: 是一个指针,指向napi_valuetype枚举的值,函数会将结果存储在这里 265 */ 266 status = napi_typeof(env, args[[param_index_replace]], &valuetype[param_name_replace]); 267 if (status != napi_ok) { 268 getErrMessage(status, env, extended_error_info, "napi_typeof", tag); 269 return nullptr; 270 } 271 [getParam_replace] 272`; 273 274export let funcGetParamTemplate = ` /* [NAPI_GEN]: argc:js传入的参数个数 */ 275 size_t argc = [param_length]; 276 /* [NAPI_GEN]: args: 一个数组,保存js传入的参数 */ 277 napi_value args[[param_length]] = {nullptr}; 278 /* [NAPI_GEN]: napi_get_cb_info用于获取JS调用该函数时所传递的参数、接收参数的个数以及'this'的值 279 * env: 当前环境的句柄,代表当前的Node.js环境 280 * info: 回调信息句柄,代表当前回调的上下文 281 * argc: 指向size_t的指针,最初应包含可接受的最大参数数量,函数返回时,它将包含实际传递的参数数量 282 * args: 一个足够大的数组,用于接收传递给回调函数的所有js参数。数组的大小应至少与argc传入的值一样大。 283 * this_arg: 如果不是NULL,则返回js回调中this的值 284 * data: 如果不是NULL,则返回与回调函数关联的任何可选数据。通常用于传递在创建函数时指定的静态数据 285 */ 286 status = napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 287 if(status != napi_ok) { 288 /* [NAPI_GEN]: 错误处理*/ 289 getErrMessage(status, env,extended_error_info, "napi_get_cb_info", tag); 290 return nullptr; 291 } 292 /* [NAPI_GEN]: 从args数组中获取入参 */ 293 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "[func_name_replace]", "[func_name_replace] get param info begins"); 294 [getAllParam_replace] 295 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "[func_name_replace]", "[func_name_replace] get param info ends"); 296`; 297 298export let uint32tIn = ` uint32_t [param_name_replace]In = 0; 299 /* [NAPI_GEN]: napi_get_value_uint32将一个napi_value类型的js布尔值转换成一个C语言的uint32_t类型的数值,第[param_index_replace]个入参 300 * env: N-API环境的句柄,表示当前的上下文 301 * value:要转换的JavaScript值 302 * result:指向 uint32_t 类型的指针,在这里函数将存储转换后的无符号整数 303 */ 304 status = napi_get_value_uint32(env, args[[param_index_replace]], &[param_name_replace]In); 305 if (status != napi_ok) { 306 getErrMessage(status, env, extended_error_info, "napi_get_value_uint32", tag); 307 return nullptr; 308 } 309`; 310 311export let stringIn = ` size_t strSize[param_index_replace] = 0; 312 /* [NAPI_GEN]: napi_get_value_string_utf8用于将Js字符串转换为UTF-8编码的C字符串 313 * env: N-API环境的句柄,表示当前的上下文 314 * value: 要转换的JavaScript字符串 315 * buf: 用于存储结果的字符数组的指针 316 * bufsize: 缓冲区大小,以字节为单位 317 * result: 转换后的字符串的字节长度(不包括空终止符)。若干buf是NULL,则返回所需的缓冲区大小(包括空终止符) 318 */ 319 /* [NAPI_GEN]: buf参数是NULL时,用于获取所需缓冲区大小*/ 320 status = napi_get_value_string_utf8(env, args[[param_index_replace]], NULL, 0, &strSize[param_index_replace]); 321 if (status != napi_ok) { 322 getErrMessage(status, env, extended_error_info, "get value string", tag); 323 return nullptr; 324 } 325 char *[param_name_replace]In = new char[strSize[param_index_replace] + 1]; 326 /* [NAPI_GEN]: 用于获取字符串*/ 327 status = napi_get_value_string_utf8(env, args[[param_index_replace]], [param_name_replace]In, strSize[param_index_replace] + 1, &strSize[param_index_replace]); 328 if (status != napi_ok) { 329 getErrMessage(status, env, extended_error_info, "get value string", tag); 330 delete[] [param_name_replace]In; 331 return nullptr; 332 } 333 // delete[] [param_name_replace]In; // remember to delete memory 334`; 335 336export let stringInUtf16 = ` size_t strSize[param_index_replace] = 0; 337 /* [NAPI_GEN]: napi_get_value_string_utf16用于将Js字符串转换为UTF-16编码的C字符串 338 * env: N-API环境的句柄,表示当前的上下文 339 * value: 要转换的JavaScript字符串 340 * buf: 用于存储结果的字符数组的指针 341 * bufsize: 缓冲区大小,以字节为单位 342 * result: 转换后的字符串的字节长度(不包括空终止符)。若干buf是NULL,则返回所需的缓冲区大小(包括空终止符) 343 */ 344 /* [NAPI_GEN]: buf参数是NULL时,用于获取所需缓冲区大小*/ 345 status = napi_get_value_string_utf16(env, args[[param_index_replace]], NULL, 0, &strSize[param_index_replace]); 346 if (status != napi_ok) { 347 getErrMessage(status, env, extended_error_info, "get value string", tag); 348 return nullptr; 349 } 350 char16_t *[param_name_replace]In = new char16_t[strSize[param_index_replace] + 1]; 351 /* [NAPI_GEN]: 用于获取字符串*/ 352 status = napi_get_value_string_utf16(env, args[[param_index_replace]], [param_name_replace]In, strSize[param_index_replace] + 1, &strSize[param_index_replace]); 353 if (status != napi_ok) { 354 getErrMessage(status, env, extended_error_info, "get value string", tag); 355 delete[] [param_name_replace]In; 356 return nullptr; 357 } 358 // delete[] [param_name_replace]In; // remember to delete memory 359`; 360 361export let int64tIn = ` int64_t [param_name_replace]In = 0; 362 /* [NAPI_GEN]: napi_get_value_int64将一个 napi_value 类型的 js 布尔值转换成一个 C 语言的 int64_t 类型的数值 363 * env: N-API环境的句柄,表示当前的上下文 364 * value:要转换的JavaScript值 365 * result:指向 int64_t 类型的指针,在这里函数将存储转换后的整数值 366 */ 367 status = napi_get_value_int64(env, args[[param_index_replace]], &[param_name_replace]In); 368 if (status != napi_ok) { 369 getErrMessage(status, env, extended_error_info, "napi_get_value_int64", tag); 370 return nullptr; 371 } 372`; 373 374export let int32tIn = ` int32_t [param_name_replace]In = 0; 375 /* [NAPI_GEN]: napi_get_value_int32将一个 napi_value 类型的 js 数值转换成一个 C 语言的 int32_t 类型的数值 376 * env: N-API环境的句柄,表示当前的上下文 377 * value:要转换的JavaScript值 378 * result:指向 int32_t 类型的指针,在这里函数将存储转换后的整数值 379 */ 380 status = napi_get_value_int32(env, args[[param_index_replace]], &[param_name_replace]In); 381 if (status != napi_ok) { 382 /* [NAPI_GEN]: 错误处理*/ 383 getErrMessage(status, env, extended_error_info, "napi_get_value_int32", tag); 384 return nullptr; 385 } 386`; 387 388export let doubleIn = ` double [param_name_replace]In = 0; 389 /* [NAPI_GEN]: napi_get_value_double将一个 napi_value 类型的 js 数值转换成一个 C 语言的 double 类型的数值 390 * env: N-API环境的句柄,表示当前的上下文 391 * value:要转换的JavaScript值 392 * result:指向 double 类型的指针,在这里函数将存储转换后的双精度浮点数 393 */ 394 status = napi_get_value_double(env, args[[param_index_replace]], &[param_name_replace]In); 395 if (status != napi_ok) { 396 getErrMessage(status, env, extended_error_info, "napi_get_value_double", tag); 397 return nullptr; 398 } 399`; 400 401export let boolIn = ` bool [param_name_replace]In = 0; 402 /* [NAPI_GEN]: napi_get_value_bool将一个 napi_value 类型的 js 布尔值转换成一个 C 语言的 bool 类型的数值 403 * env: N-API环境的句柄,表示当前的上下文 404 * value:要转换的JavaScript值 405 * result:指向 bool 类型的指针,在这里函数将存储转换后的布尔值 406 */ 407 status = napi_get_value_bool(env, args[[param_index_replace]], &[param_name_replace]In); 408 if (status != napi_ok) { 409 getErrMessage(status, env, extended_error_info, "napi_get_value_bool", tag); 410 return nullptr; 411 } 412`; 413 414export let callbackIn = ` 415 napi_value argv; 416 // Todo: 创建要传递给回调函数的参数 417 napi_value result; 418 /** 419 * env: napi_env 类型的环境变量 420 * this_arg: 指向 JavaScript 对象的指针,表示回调函数中的 this 值。如果不需要递 this 值,则可以设置为 nullptr。 421 * func: 指向 JavaScript 回调函数的指针。 422 * argc: 传递给回调函数的参数数量。示例中传递了一个参数。 423 * argv: 一个 napi_value 类型的数组,用于存储要传递给回调函数的参数。示例中传递了一个参数。 424 425 * result: 指向返回值的指针。如果回调函数没有返回值,则可以设置为 nullptr。 426 */ 427 napi_call_function(env, nullptr, args[[param_index_replace]], 1, &argv, result); 428`; 429 430// class与struct模板 class主体 放在xxxnapi.cpp中 431export let classTemplate = ` 432// class napi框架主体 433// 这里构造函数都是默认无参构造函数,如果需要自定义构造函数,可以自行添加 434[class_name_replace]::[class_name_replace]() {} 435[class_name_replace]::~[class_name_replace]() { napi_delete_reference(env_, wrapper_); } 436void [class_name_replace]::Destructor(napi_env env, void* nativeObject, [[maybe_unused]] void* finalize_hint) 437{ 438 reinterpret_cast<[class_name_replace]*>(nativeObject)->~[class_name_replace](); 439} 440napi_value [class_name_replace]::New(napi_env env, napi_callback_info info) 441{ 442 napi_value newTarget; 443 napi_status status; 444 // Check if the constructor was invoked with new. 445 napi_get_new_target(env, info, &newTarget); 446 if (newTarget != nullptr) { 447 // Invoked as the constructor "new [class_name_replace]()". 448 napi_value jsThis; 449 // Retrieve the callback's context and arguments. 450 status = napi_get_cb_info(env, info, nullptr, nullptr, &jsThis, nullptr); 451 if (status != napi_ok) { 452 getErrMessage(status, env, extended_error_info, "napi_get_cb_info", tag); 453 return nullptr; 454 } 455 // Create the C++ object. 默认调用无参构造函数,如果需要自定义构造函数,可以自行添加 456 [class_name_replace]* obj = new [class_name_replace](); 457 obj->env_ = env; 458 // Wrap the C++ object obj in the ArkTS object jsThis. 459 status =napi_wrap(env, jsThis, reinterpret_cast<void*>(obj), [class_name_replace]::Destructor, nullptr, &obj->wrapper_); 460 if (status != napi_ok) { 461 getErrMessage(status, env, extended_error_info, "napi_wrap", tag); 462 return nullptr; 463 } 464 delete obj; 465 return jsThis; 466 } else { 467 OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, "CLASS", "[class_name_replace] must be invoked as a constructor with 'new'"); 468 return nullptr; 469 } 470} 471[class_property_get_set_replace] 472[class_method_content_replace] 473` 474 475// class的声明,放在xxxnapi.h文件中 476export let classNapiHTemplate = ` 477class [class_name_replace] { 478 public: 479 static napi_value Init(napi_env env, napi_value exports); 480 static void Destructor(napi_env env, void* nativeObject, void*finalize_hint); 481 private: 482 explicit [class_name_replace](); 483 ~[class_name_replace](); 484 static napi_value New(napi_env env, napi_callback_info info); 485 // 属性的get set函数声明 486 [class_property_get_set_declare] 487 // 方法的声明 488 [class_method_declare] 489 // 变量的声明 490 [class_variable_declare] 491 napi_env env_; 492 napi_ref wrapper_; 493}; 494` 495 496// 替换classNapiHTemplate模板中的内容 497export let classMethodDeclareTemplate = ` 498 static napi_value [class_method_name_replace](napi_env env, napi_callback_info info); 499` 500 501// 成员方法无入参 502export let classMethodNoParamTemplate = ` 503 napi_value jsThis; 504 // 注释 505 status = napi_get_cb_info(env, info, nullptr, nullptr, &jsThis, nullptr); 506 if (status != napi_ok) { 507 getErrMessage(status, env, extended_error_info, "napi_get_cb_info", tag); 508 return nullptr; 509 } 510` 511 512// 成员方法有入参 513export let classMethodGetParamTemplate = ` 514 napi_value jsThis; 515 size_t argc = [param_count_replace]; 516 napi_value args[[param_count_replace]]; 517 // 注释 518 status = napi_get_cb_info(env, info, &argc, args, &jsThis, nullptr); 519 if (status != napi_ok) { 520 getErrMessage(status, env, extended_error_info, "napi_get_cb_info", tag); 521 return nullptr; 522 } 523 [class_method_get_param] 524` 525 526// class的成员方法Napi实现 放在xxxnapi.cpp文件中 527export let classMethodTemplate = ` 528// [NAPI_GEN]:class成员函数的实现方法 529napi_value [class_name_replace]::[class_method_name_replace](napi_env env, napi_callback_info info) 530{ 531 [class_method_param_in] 532 // Todo: business logic here. 533 [class_name_replace]* obj; 534 // 通过napi_unwrap将jsThis之前绑定的C++对象取出,并对其进行操作 535 napi_unwrap(env, jsThis, reinterpret_cast<void**>(&obj)); 536 // Todo: you can get value from js and set value to C++. 537 [class_method_return] 538} 539` 540export let classPropertyGetTemplate = ` 541// [NAPI_GEN]:class成员变量的get方法 542napi_value [class_name_replace]::Get[class_property_name_replace](napi_env env napi_callback_info info) 543{ 544 napi_value jsThis; 545 napi_get_cb_info(env, info, nullptr, nullptr, &jsThis, nullptr); 546 [class_name_replace]* obj; 547 // Retrieve obj (the C++ object) previously wrapped in jsThis (the ArkTobject), and perform subsequent operations. 548 napi_unwrap(env, jsThis, reinterpret_cast<void**>(&obj)); 549 // Todo: get value from C++. 550 // return value to js... 551 [class_property_get] 552} 553`; 554 555export let classPropertySetTemplate = ` 556// [NAPI_GEN]:class成员变量的set方法 557napi_value [class_name_replace]::Set[class_property_name_replace](napi_env env, napi_callback_info info) 558{ 559 napi_value jsThis; 560 napi_get_cb_info(env, info, nullptr, nullptr, &jsThis, nullptr); 561 [class_name_replace]* obj; 562 napi_unwrap(env, jsThis, reinterpret_cast<void**>()); 563 napi_value jsThis; 564 size_t argc = 1; 565 napi_value args[1]; 566 napi_get_cb_info(env, info, &argc, args, &jsThis, nullptr); 567 [class_name_replace]* obj; 568 napi_unwrap(env, jsThis, reinterpret_cast<void**>(&obj)); 569 // 例如: napi_get_value_int32(env, args[0], &obj->a); 570 [class_property_set] 571 // Todo: set value to C++. 572 return nullptr; 573} 574`; 575 576// 每个类的成员属性都对应一个get和set函数 577export let classPropertyDeclareTemplate = ` 578 // [NAPI_GEN]:方法注册后,js与native的class属性映射get与set 579 { [class_property_name_replace], 0, 0, Get[class_property_name_replace], Set[class_property_name_replace], 0, napi_default, 0 }, 580`; 581 582export let classInitTemplate = ` 583 // Define properties and methods for a N-API object 584 napi_property_descriptor [class_name_replace]Properties[] = { 585 // 成员属性的get与set 586 [class_property_replace] 587 // 成员方法的调用 588 [class_method_replace] 589 }; 590 napi_value cons; 591 // Define a js class 这里需要介绍class这个参数 592 napi_define_class(env, "[class_name_replace]", NAPI_AUTO_LENGTH, New, nullptr, 593 sizeof([class_name_replace]Properties) / sizeof([class_name_replace]Properties[0]), [class_name_replace]Properties, &cons); 594 // Set the '[class_name_replace]' class on the exports object. 595 napi_set_named_property(env, exports, "[class_name_replace]", cons); 596` 597 598// napi testAbility需要生成的方法模板 599export let testAbilityFuncTemplate = ` /* [NAPI_GEN]:对应[file_introduce_replace]中:[test_case_name]的dts接口测试用例 600 * 方法输入: [input_introduce_replace] 601 * 方法输出: [func_return_replace] 602 */ 603 it('[test_case_name]', 0, () => { 604 // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. 605 hilog.info(0x0000, 'testTag', '%{public}s', 'it [test_case_name] begin'); 606 607 [func_direct_testCase] 608 609 // Defines a variety of assertion methods, which are used to declare expected boolean conditions. 610 // e.g. expect(result).assertEqual(2+3) 611 }) 612`; 613