From 8cf30b652c93deab1555df66ab55287676c51fd3 Mon Sep 17 00:00:00 2001 From: wangshi Date: Thu, 24 Apr 2025 14:54:17 +0800 Subject: [PATCH] add async, promise Signed-off-by: wangshi --- .../src/main/java/gen/GenNapiCppFile.java | 98 +- .../src/test/java/gen/GenCHFileTest.java | 78 +- .../src/test/java/gen/GenCppHFileTest.java | 2 +- .../src/test/java/gen/GenNapiCppFileTest.java | 8 + .../test/java/gen/GenNapiCppFileTest2.java | 202 ++- .../test/java/gen/GenNapiCppFileTest3.java | 1234 ++++++++++++++++- 6 files changed, 1502 insertions(+), 120 deletions(-) diff --git a/src/intellij_plugin/ohosgen/src/main/java/gen/GenNapiCppFile.java b/src/intellij_plugin/ohosgen/src/main/java/gen/GenNapiCppFile.java index 4936f2ee..deb9e1ad 100644 --- a/src/intellij_plugin/ohosgen/src/main/java/gen/GenNapiCppFile.java +++ b/src/intellij_plugin/ohosgen/src/main/java/gen/GenNapiCppFile.java @@ -280,7 +280,7 @@ public class GenNapiCppFile extends GeneratorBase { private static final String NAPI_FUNCTION_DESC_PROPERTY = "NAPI_FUNCTION_DESC_DECLARE"; private static final String NAPI_PARAM_NAME = "NAPI_PARAM_NAME"; private static final String NAPI_PARAM_TYPE = "NAPI_PARAM_TYPE"; - + private static final String NAPI_PARAM_EXPRESSION = "NAPI_PARAM_EXPRESSION"; private static final String NAPI_GET_ARGUMENTS_DECLARE = "NAPI_GET_ARGUMENTS_DECLARE"; private static final String NAPI_CLASS_CALL_METHOD_DECLARE = "NAPI_CLASS_CALL_METHOD_DECLARE"; private static final String NAPI_CLASS_RETURN_VALUE_DECLARE = "NAPI_CLASS_RETURN_VALUE_DECLARE"; @@ -295,6 +295,7 @@ public class GenNapiCppFile extends GeneratorBase { "\n\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);" + "\n\t// 参数校验" + "\n\tif (argc < NAPI_PARAM_CNT) {" + + "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < NAPI_PARAM_CNT error\");" + "\n\t\tnapi_throw_error(env, \"EINVAL\", \"需要NAPI_PARAM_CNT个参数\");" + "\n\t\treturn nullptr;" + "\n\t};\n\n"; @@ -365,26 +366,59 @@ public class GenNapiCppFile extends GeneratorBase { private static final String NAPI_CREATE_RET_TYPE = "NAPI_CREATE_RET_TYPE"; - private static final String NAPI_ASYNC_DATA = "\nstruct NAPI_FUNCTION_NAMEAsyncData {\n" + + private static final String NAPI_ASYNC_DATA = "\nstruct NAPI_FUNCTION_NAMEData {\n" + "\tnapi_async_work work;\t\t\t// 异步工作句柄\n" + "\tnapi_deferred deferred;\t\t\t// Promise句柄(如果使用Promise)\n" + "\tnapi_ref callback_ref;\t\t\t// JS回调引用\n" + - "\tNAPI_ASYNC_DATA_PARAM\n" + + "NAPI_ASYNC_DATA_PARAM" + "\tNAPI_RET_TYPE result;\t\t\t// 返回值\n" + "\tnapi_status status;\t\t\t// 执行状态\n" + "};\n"; private static final String NAPI_EXECUTE_WORK = "\n// 实际执行计算的线程池任务\n" + "void NAPI_FUNCTION_NAMEExecuteWork(napi_env env, void* data) {\n" + - "\tNAPI_FUNCTION_NAMEAsyncData* async_data = static_cast(data);\n" + + "\tNAPI_FUNCTION_NAMEData* async_data = static_cast(data);\n" + "\t// 调用原始类方法\n" + "\tNAPI_CLASS_CALL_METHOD_DECLARE\n" + "\tasync_data->result = res; // 实际计算\n" + "}\n"; - private static final String NAPI_COMPLETE_WORK = "\n// 计算结果返回给JS事件循环\n" + + private static final String NAPI_PROMISE_COMPLETE_WORK = "\n// 计算结果返回给JS事件循环\n" + + "void NAPI_FUNCTION_NAMECompleteWork(napi_env env, napi_status status, void* data) {\n" + + "\tNAPI_FUNCTION_NAMEData* async_data = static_cast(data);\n" + + "\n" + + "\t// 准备回调参数\n" + + "\tnapi_value argv[2] = { nullptr };\n" + + "\tif (async_data->status == napi_ok) {\n" + + "\t\tNAPI_CREATE_RET_TYPE\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t} else {\n" + + "\t\tnapi_value error_msg;\n" + + "\t\tnapi_create_string_utf8(env, \"NAPI_FUNCTION_NAME failed\", NAPI_AUTO_LENGTH, &error_msg);\n" + + "\t\tnapi_create_error(env, NULL, error_msg, &argv[1]);\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t}\n" + + "\n" + + "\t// 获取JS回调函数\n" + + "\tif (async_data->deferred) {\n" + + "\t\tif (status == napi_ok) {\n" + + "\t\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"resolve promise\");" + + "\t\t\tnapi_resolve_deferred(env, async_data->deferred, argv);\n" + + "\t\t} else {\n" + + "\t\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"reject promise\");" + + "\t\t\tnapi_reject_deferred(env, async_data->deferred, argv);\n" + + "\t\t}\n" + + "\t}\n" + + "\n" + + "\t// 清理资源\n" + + "\tnapi_delete_async_work(env, async_data->work);\n" + + "\tnapi_delete_reference(env, async_data->callback_ref);\n" + + "\tdelete async_data;\n" + + "};\n"; + + private static final String NAPI_ASYNC_COMPLETE_WORK = "\n// 计算结果返回给JS事件循环\n" + "void NAPI_FUNCTION_NAMECompleteWork(napi_env env, napi_status status, void* data) {\n" + - "\tNAPI_FUNCTION_NAMEAsyncData* async_data = static_cast(data);\n" + + "\tNAPI_FUNCTION_NAMEData* async_data = static_cast(data);\n" + "\n" + "\t// 准备回调参数\n" + "\tnapi_value argv[2] = { nullptr };\n" + @@ -1124,6 +1158,12 @@ public class GenNapiCppFile extends GeneratorBase { return resContent; }; + private String genDataParam(ParamObj pa, int off) { + String name = pa.getName().isEmpty() ? "value" + Integer.toString(off) : pa.getName(); + String type = pa.getType() == null ? NAPI_AUTO_TOKEN : pa.getType(); + return NAPI_TAB_SPACE + type + NAPI_BLANK_SPACE + name + NAPI_SEMICOLON + NAPI_NEW_LINE; + } + private String genFuncCall(FuncObj fo) { System.out.println("genFuncCall : " + fo.getName()); return NAPI_FUNCTION_CALL_EXPRESSION.replace(NAPI_FUNCTION_NAME, fo.getName()); @@ -1181,13 +1221,35 @@ public class GenNapiCppFile extends GeneratorBase { String funcGetParamStr = ""; String funcCallStr = ""; String funcRetStr = ""; + String dataParamStr = ""; + String paramListStr = ""; int i = 0; for (ParamObj pa : fo.getParamList()) { funcGetParamStr += genGetParam(pa, i); + dataParamStr += genDataParam(pa, i); + paramListStr += pa.getName() + NAPI_COMMA + NAPI_BLANK_SPACE; i++; } + paramListStr = StringUtils.removeLastCharacter(paramListStr, 2); + // create async function template funcCallStr += genFuncCall(fo); funcRetStr += genFuncRet(fo.getRetValue()); + + // create async data + String retType = fo.getType().isEmpty() ? NAPI_VOID_TOKEN : fo.getType(); + String asyncDataStr = NAPI_ASYNC_DATA.replace(NAPI_FUNCTION_NAME, funcName); + asyncDataStr = asyncDataStr.replace(NAPI_ASYNC_DATA_PARAM, dataParamStr); + asyncDataStr = asyncDataStr.replace(NAPI_RET_TYPE, retType); + + // create execute work + String exeWorkStr = NAPI_EXECUTE_WORK.replace(NAPI_FUNCTION_NAME, funcName); + exeWorkStr = exeWorkStr.replace(NAPI_CLASS_CALL_METHOD_DECLARE, funcCallStr); + exeWorkStr = exeWorkStr.replace(NAPI_PARAM_EXPRESSION, paramListStr); + + // create complete work + String completeWorkStr = NAPI_ASYNC_COMPLETE_WORK.replace(NAPI_FUNCTION_NAME, funcName); + completeWorkStr = completeWorkStr.replace(NAPI_CREATE_RET_TYPE, funcRetStr); + String paCheckStr = NAPI_PARAM_CHECK.replace(NAPI_PARAM_CNT, Integer.toString(fo.getParamList().size())); String funcDeclareStr = NAPI_FUNCTION_DECLARE.replace(NAPI_FUNCTION_NAME, funcName); funcDeclareStr = funcDeclareStr.replace(NAPI_GET_ARGUMENTS_DECLARE, paCheckStr + funcGetParamStr); @@ -1199,7 +1261,7 @@ public class GenNapiCppFile extends GeneratorBase { String funcInitStr = NAPI_FUNCTION_INIT.replace(NAPI_FUNCTION_DESC_PROPERTY, funcPropertyStr); String resContent = ""; - resContent += funcDeclareStr + funcInitStr; + resContent += asyncDataStr + exeWorkStr + completeWorkStr + funcDeclareStr + funcInitStr; return resContent; } @@ -1211,13 +1273,35 @@ public class GenNapiCppFile extends GeneratorBase { String funcGetParamStr = ""; String funcCallStr = ""; String funcRetStr = ""; + String dataParamStr = ""; + String paramListStr = ""; int i = 0; for (ParamObj pa : fo.getParamList()) { funcGetParamStr += genGetParam(pa, i); + dataParamStr += genDataParam(pa, i); + paramListStr += pa.getName() + NAPI_COMMA + NAPI_BLANK_SPACE; i++; } + paramListStr = StringUtils.removeLastCharacter(paramListStr, 2); + // create async function template funcCallStr += genFuncCall(fo); funcRetStr += genFuncRet(fo.getRetValue()); + + // create async data + String retType = fo.getType().isEmpty() ? NAPI_VOID_TOKEN : fo.getType(); + String asyncDataStr = NAPI_ASYNC_DATA.replace(NAPI_FUNCTION_NAME, funcName); + asyncDataStr = asyncDataStr.replace(NAPI_ASYNC_DATA_PARAM, dataParamStr); + asyncDataStr = asyncDataStr.replace(NAPI_RET_TYPE, retType); + + // create execute work + String exeWorkStr = NAPI_EXECUTE_WORK.replace(NAPI_FUNCTION_NAME, funcName); + exeWorkStr = exeWorkStr.replace(NAPI_CLASS_CALL_METHOD_DECLARE, funcCallStr); + exeWorkStr = exeWorkStr.replace(NAPI_PARAM_EXPRESSION, paramListStr); + + // create complete work + String completeWorkStr = NAPI_PROMISE_COMPLETE_WORK.replace(NAPI_FUNCTION_NAME, funcName); + completeWorkStr = completeWorkStr.replace(NAPI_CREATE_RET_TYPE, funcRetStr); + String paCheckStr = NAPI_PARAM_CHECK.replace(NAPI_PARAM_CNT, Integer.toString(fo.getParamList().size())); String funcDeclareStr = NAPI_FUNCTION_DECLARE.replace(NAPI_FUNCTION_NAME, funcName); funcDeclareStr = funcDeclareStr.replace(NAPI_GET_ARGUMENTS_DECLARE, paCheckStr + funcGetParamStr); diff --git a/src/intellij_plugin/ohosgen/src/test/java/gen/GenCHFileTest.java b/src/intellij_plugin/ohosgen/src/test/java/gen/GenCHFileTest.java index 1d4fa2fc..df80f1d7 100644 --- a/src/intellij_plugin/ohosgen/src/test/java/gen/GenCHFileTest.java +++ b/src/intellij_plugin/ohosgen/src/test/java/gen/GenCHFileTest.java @@ -52,7 +52,7 @@ class GenCHFileTest { eol.add(eo); ParseObj po = new ParseObj(); po.setEnumList(eol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genEnumList(po.getEnumList()); if (gb instanceof GenCppFile gdf) { @@ -84,7 +84,7 @@ class GenCHFileTest { eol.add(eo); ParseObj po = new ParseObj(); po.setEnumList(eol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genEnumList(po.getEnumList()); if (gb instanceof GenCppFile gdf) { @@ -117,7 +117,7 @@ class GenCHFileTest { eol.add(eo); ParseObj po = new ParseObj(); po.setEnumList(eol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genEnumList(po.getEnumList()); if (gb instanceof GenCppFile gdf) { @@ -163,7 +163,7 @@ class GenCHFileTest { ParseObj po = new ParseObj(); po.setClassList(col); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genClassList(po.getClassList()); if (gb instanceof GenCppFile gdf) { @@ -215,7 +215,7 @@ class GenCHFileTest { ParseObj po = new ParseObj(); po.setClassList(col); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genClassList(po.getClassList()); if (gb instanceof GenCppFile gdf) { @@ -273,7 +273,7 @@ class GenCHFileTest { ParseObj po = new ParseObj(); po.setClassList(col); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genClassList(po.getClassList()); if (gb instanceof GenCppFile gdf) { @@ -308,7 +308,7 @@ class GenCHFileTest { ParseObj po = new ParseObj(); po.setClassList(col); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genClassList(po.getClassList()); if (gb instanceof GenCppFile gdf) { @@ -355,7 +355,7 @@ class GenCHFileTest { ParseObj po = new ParseObj(); po.setClassList(col); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genClassList(po.getClassList()); if (gb instanceof GenCppFile gdf) { @@ -401,7 +401,7 @@ class GenCHFileTest { ParseObj po = new ParseObj(); po.setClassList(col); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genClassList(po.getClassList()); if (gb instanceof GenCppFile gdf) { @@ -431,7 +431,7 @@ class GenCHFileTest { ParseObj po = new ParseObj(); po.setClassList(col); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genClassList(po.getClassList()); if (gb instanceof GenCppFile gdf) { @@ -455,7 +455,7 @@ class GenCHFileTest { fol.add(fo); ParseObj po = new ParseObj(); po.setFuncList(fol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genFuncList(po.getFuncList()); if (gb instanceof GenCppFile gdf) { @@ -481,7 +481,7 @@ class GenCHFileTest { fol.add(fo); ParseObj po = new ParseObj(); po.setFuncList(fol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genFuncList(po.getFuncList()); if (gb instanceof GenCppFile gdf) { @@ -511,7 +511,7 @@ class GenCHFileTest { fol.add(fo); ParseObj po = new ParseObj(); po.setFuncList(fol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genFuncList(po.getFuncList()); if (gb instanceof GenCppFile gdf) { @@ -537,7 +537,7 @@ class GenCHFileTest { fol.add(fo); ParseObj po = new ParseObj(); po.setFuncList(fol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genFuncList(po.getFuncList()); if (gb instanceof GenCppFile gdf) { @@ -563,7 +563,7 @@ class GenCHFileTest { fol.add(fo); ParseObj po = new ParseObj(); po.setFuncList(fol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genFuncList(po.getFuncList()); if (gb instanceof GenCppFile gdf) { @@ -592,7 +592,7 @@ class GenCHFileTest { fol.add(fo); ParseObj po = new ParseObj(); po.setFuncList(fol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genFuncList(po.getFuncList()); if (gb instanceof GenCppFile gdf) { @@ -626,7 +626,7 @@ class GenCHFileTest { fol.add(fo); ParseObj po = new ParseObj(); po.setFuncList(fol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genFuncList(po.getFuncList()); if (gb instanceof GenCppFile gdf) { @@ -662,7 +662,7 @@ class GenCHFileTest { ParseObj po = new ParseObj(); po.setStructList(sol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genStructList(po.getStructList()); if (gb instanceof GenCppFile gdf) { @@ -703,7 +703,7 @@ class GenCHFileTest { ParseObj po = new ParseObj(); po.setStructList(sol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genStructList(po.getStructList()); if (gb instanceof GenCppFile gdf) { @@ -743,7 +743,7 @@ class GenCHFileTest { ParseObj po = new ParseObj(); po.setStructList(sol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genStructList(po.getStructList()); if (gb instanceof GenCppFile gdf) { @@ -768,7 +768,7 @@ class GenCHFileTest { ParseObj po = new ParseObj(); po.setStructList(sol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genStructList(po.getStructList()); if (gb instanceof GenCppFile gdf) { @@ -796,7 +796,7 @@ class GenCHFileTest { uol.add(uo); ParseObj po = new ParseObj(); po.setUnionList(uol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genUnionList(po.getUnionList()); if (gb instanceof GenCppFile gdf) { @@ -824,7 +824,7 @@ class GenCHFileTest { uol.add(uo); ParseObj po = new ParseObj(); po.setUnionList(uol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genUnionList(po.getUnionList()); if (gb instanceof GenCppFile gdf) { @@ -848,7 +848,7 @@ class GenCHFileTest { pol.add(paObj); ParseObj po = new ParseObj(); po.setVarList(pol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genVarList(po.getVarList()); if (gb instanceof GenCppFile gdf) { @@ -870,7 +870,7 @@ class GenCHFileTest { pol.add(paObj); ParseObj po = new ParseObj(); po.setVarList(pol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genVarList(po.getVarList()); if (gb instanceof GenCppFile gdf) { @@ -892,7 +892,7 @@ class GenCHFileTest { pol.add(paObj); ParseObj po = new ParseObj(); po.setVarList(pol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genVarList(po.getVarList()); if (gb instanceof GenCppFile gdf) { @@ -921,7 +921,7 @@ class GenCHFileTest { pol.add(paObj); ParseObj po = new ParseObj(); po.setVarList(pol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genVarList(po.getVarList()); if (gb instanceof GenCppFile gdf) { @@ -945,7 +945,7 @@ class GenCHFileTest { pol.add(paObj); ParseObj po = new ParseObj(); po.setVarList(pol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genVarList(po.getVarList()); if (gb instanceof GenCppFile gdf) { @@ -990,7 +990,7 @@ class GenCHFileTest { pol.add(paObj); ParseObj po = new ParseObj(); po.setVarList(pol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genVarList(po.getVarList()); if (gb instanceof GenCppFile gdf) { @@ -1020,7 +1020,7 @@ class GenCHFileTest { pol.add(pao); po.setVarList(pol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genVarList(pol); if (gb instanceof GenCppFile gdf) { @@ -1042,7 +1042,7 @@ class GenCHFileTest { pol.add(pao); po.setVarList(pol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genContent(po); if (gb instanceof GenCppFile gdf) { @@ -1065,7 +1065,7 @@ class GenCHFileTest { ParseObj po = new ParseObj(); po.setVarList(pol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genContent(po); gb.genFile("./", "testGenFile.d.ts"); @@ -1077,7 +1077,7 @@ class GenCHFileTest { assertEquals("// Generated from ./\\testGenFile.d.ts by KaiHong ohgen 1.0.0-PLUGIN", fcList.get(0)); - assertEquals("const int TestParam = 100;", + assertEquals("extends const int TestParam = 100;", fcList.get(1)); if (gb instanceof GenCppFile gdf) { @@ -1108,7 +1108,7 @@ class GenCHFileTest { eol.add(eo); ParseObj po = new ParseObj(); po.setEnumList(eol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genEnumList(po.getEnumList()); if (gb instanceof GenCppFile gdf) { @@ -1154,7 +1154,7 @@ class GenCHFileTest { ParseObj po = new ParseObj(); po.setClassList(col); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genClassList(po.getClassList()); if (gb instanceof GenCppFile gdf) { @@ -1181,7 +1181,7 @@ class GenCHFileTest { fol.add(fo); ParseObj po = new ParseObj(); po.setFuncList(fol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genFuncList(po.getFuncList()); if (gb instanceof GenCppFile gdf) { @@ -1217,7 +1217,7 @@ class GenCHFileTest { ParseObj po = new ParseObj(); po.setStructList(sol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genStructList(po.getStructList()); if (gb instanceof GenCppFile gdf) { @@ -1249,7 +1249,7 @@ class GenCHFileTest { uol.add(uo); ParseObj po = new ParseObj(); po.setUnionList(uol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genUnionList(po.getUnionList()); if (gb instanceof GenCppFile gdf) { @@ -1274,7 +1274,7 @@ class GenCHFileTest { pol.add(pao); po.setVarList(pol); - GeneratorBase gb = GenerateFactory.getGenerator("CPP"); + GeneratorBase gb = GenerateFactory.getGenerator("CH"); gb.genVarList(pol); if (gb instanceof GenCppFile gdf) { diff --git a/src/intellij_plugin/ohosgen/src/test/java/gen/GenCppHFileTest.java b/src/intellij_plugin/ohosgen/src/test/java/gen/GenCppHFileTest.java index 59b8405e..26c6968c 100644 --- a/src/intellij_plugin/ohosgen/src/test/java/gen/GenCppHFileTest.java +++ b/src/intellij_plugin/ohosgen/src/test/java/gen/GenCppHFileTest.java @@ -1077,7 +1077,7 @@ class GenCppHFileTest { assertEquals("// Generated from ./\\testGenFile.d.ts by KaiHong ohgen 1.0.0-PLUGIN", fcList.get(0)); - assertEquals("const int TestParam = 100;", + assertEquals("extends const int TestParam = 100;", fcList.get(1)); if (gb instanceof GenCppHFile gdf) { diff --git a/src/intellij_plugin/ohosgen/src/test/java/gen/GenNapiCppFileTest.java b/src/intellij_plugin/ohosgen/src/test/java/gen/GenNapiCppFileTest.java index 437a8f99..d6672f64 100644 --- a/src/intellij_plugin/ohosgen/src/test/java/gen/GenNapiCppFileTest.java +++ b/src/intellij_plugin/ohosgen/src/test/java/gen/GenNapiCppFileTest.java @@ -113,6 +113,7 @@ class GenNapiCppFileTest { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + @@ -317,6 +318,7 @@ class GenNapiCppFileTest { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 0) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 0 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要0个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + @@ -548,6 +550,7 @@ class GenNapiCppFileTest { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 0) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 0 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要0个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + @@ -580,6 +583,7 @@ class GenNapiCppFileTest { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 0) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 0 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要0个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + @@ -771,6 +775,7 @@ class GenNapiCppFileTest { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 0) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 0 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要0个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + @@ -844,6 +849,7 @@ class GenNapiCppFileTest { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + @@ -998,6 +1004,7 @@ class GenNapiCppFileTest { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + @@ -1070,6 +1077,7 @@ class GenNapiCppFileTest { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + diff --git a/src/intellij_plugin/ohosgen/src/test/java/gen/GenNapiCppFileTest2.java b/src/intellij_plugin/ohosgen/src/test/java/gen/GenNapiCppFileTest2.java index 58d43d38..69442e37 100644 --- a/src/intellij_plugin/ohosgen/src/test/java/gen/GenNapiCppFileTest2.java +++ b/src/intellij_plugin/ohosgen/src/test/java/gen/GenNapiCppFileTest2.java @@ -84,6 +84,7 @@ class GenNapiCppFileTest2 { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + @@ -167,6 +168,7 @@ class GenNapiCppFileTest2 { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 1) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 1 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要1个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + @@ -472,6 +474,7 @@ class GenNapiCppFileTest2 { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + @@ -590,6 +593,7 @@ class GenNapiCppFileTest2 { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + @@ -639,13 +643,207 @@ class GenNapiCppFileTest2 { "\n" + "\t// 调用原始类方法\n" + "\tTestFunc(NAPI_PARAM_EXPRESSION);\n" + - "\t// 创建返回参数\n\t\n" + + "\t// 创建返回参数\n" + + "\t\n" + "\treturn result;\n" + "};\n" + "napi_property_descriptor funcDesc[] = {\n" + "\t{ \"testFunc\", nullptr, testFuncNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + "};\n" + - "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);"; + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n" + + "\n" + + "struct testFuncAsyncData {\n" + + "\tnapi_async_work work;\t\t\t// 异步工作句柄\n" + + "\tnapi_deferred deferred;\t\t\t// Promise句柄(如果使用Promise)\n" + + "\tnapi_ref callback_ref;\t\t\t// JS回调引用\n" + + "\tstring name;\n" + + "\tnumber age;\n" + + "\tvoid result;\t\t\t// 返回值\n" + + "\tnapi_status status;\t\t\t// 执行状态\n" + + "};\n" + + "\n" + + "// 实际执行计算的线程池任务\n" + + "void testFuncAsyncExecuteWork(napi_env env, void* data) {\n" + + "\ttestFuncAsyncData* async_data = static_cast(data);\n" + + "\t// 调用原始类方法\n" + + "\tTestFunc(name, age);\n" + + "\tasync_data->result = res; // 实际计算\n" + + "}\n" + + "\n" + + "// 计算结果返回给JS事件循环\n" + + "void testFuncAsyncCompleteWork(napi_env env, napi_status status, void* data) {\n" + + "\ttestFuncAsyncData* async_data = static_cast(data);\n" + + "\n" + + "\t// 准备回调参数\n" + + "\tnapi_value argv[2] = { nullptr };\n" + + "\tif (async_data->status == napi_ok) {\n" + + "\t\t\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t} else {\n" + + "\t\tnapi_value error_msg;\n" + + "\t\tnapi_create_string_utf8(env, \"testFuncAsync failed\", NAPI_AUTO_LENGTH, &error_msg);\n" + + "\t\tnapi_create_error(env, NULL, error_msg, &argv[1]);\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t}\n" + + "\n" + + "\t// 获取JS回调函数\n" + + "\tnapi_value callback;\n" + + "\tnapi_get_reference_value(env, async_data->callback_ref, &callback);\n" + + "\n" + + "\t// 调用回调\n" + + "\tnapi_value global;\n" + + "\tnapi_get_global(env, &global);\n" + + "\tnapi_call_function(env, global, callback, 2, argv, nullptr);\n" + + "\n" + + "\t// 清理资源\n" + + "\tnapi_delete_async_work(env, async_data->work);\n" + + "\tnapi_delete_reference(env, async_data->callback_ref);\n" + + "\tdelete async_data;\n" + + "};\n" + + "\n" + + "napi_value testFuncAsyncNapi(napi_env env, napi_callback_info info)\n" + + "{\n" + + "\tnapi_value result = nullptr;\n" + + "\tnapi_value jsthis;\n" + + "\tnapi_status status;\n" + + "\tnapi_get_undefined(env, &result);\n" + + "\t// 获取参数\n" + + "\tsize_t argc = 2;\n" + + "\tnapi_value args[2] = {nullptr};\n" + + "\tnapi_value this_arg;\n" + + "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + + "\t// 参数校验\n" + + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + + "\t\treturn nullptr;\n" + + "\t};\n" + + "\n" + + "\tnapi_valuetype valuetype0;\n" + + "\tif (napi_typeof(env, args[0], &valuetype0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\tif (type != napi_string) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_string error\");\n" + + "\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", \"第0个参数必须是字符串\");\n" + + "\t\treturn result;\n" + + "\t}\n" + + "\n" + + "\tchar* value0[MAX_BUFFER_SIZE];\n" + + "\tsize_t bufferSize = MAX_BUFFER_SIZE;\n" + + "\tsize_t realSize = 0;\n" + + "\tif (napi_get_value_string_utf8(env, args[0], &value0, bufferSize, &realSize) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\n" + + "\tnapi_valuetype valuetype1;\n" + + "\tif (napi_typeof(env, args[1], &valuetype1) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\tif (type != napi_number) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_number error\");\n" + + "\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", \"第valuetype1个参数必须是数字\");\n" + + "\t\treturn result;\n" + + "\t}\n" + + "\n" + + "\tint value1 = 0;\n" + + "\n" + + "\tsize_t bufferSize = MAX_BUFFER_SIZE;\n" + + "\tsize_t realSize = 0;\n" + + "\tif (napi_get_value_int32(env, args[1], &value1) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_int32 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\n" + + "\t// 调用原始类方法\n" + + "\tTestFunc(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\t\n" + + "\treturn result;\n" + + "};\n" + + "napi_property_descriptor funcDesc[] = {\n" + + "\t{ \"testFuncAsync\", nullptr, testFuncAsyncNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "};\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n" + + "\n" + + "napi_value testFuncPromiseNapi(napi_env env, napi_callback_info info)\n" + + "{\n" + + "\tnapi_value result = nullptr;\n" + + "\tnapi_value jsthis;\n" + + "\tnapi_status status;\n" + + "\tnapi_get_undefined(env, &result);\n" + + "\t// 获取参数\n" + + "\tsize_t argc = 2;\n" + + "\tnapi_value args[2] = {nullptr};\n" + + "\tnapi_value this_arg;\n" + + "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + + "\t// 参数校验\n" + + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + + "\t\treturn nullptr;\n" + + "\t};\n" + + "\n" + + "\tnapi_valuetype valuetype0;\n" + + "\tif (napi_typeof(env, args[0], &valuetype0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\tif (type != napi_string) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_string error\");\n" + + "\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", \"第0个参数必须是字符串\");\n" + + "\t\treturn result;\n" + + "\t}\n" + + "\n" + + "\tchar* value0[MAX_BUFFER_SIZE];\n" + + "\tsize_t bufferSize = MAX_BUFFER_SIZE;\n" + + "\tsize_t realSize = 0;\n" + + "\tif (napi_get_value_string_utf8(env, args[0], &value0, bufferSize, &realSize) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\n" + + "\tnapi_valuetype valuetype1;\n" + + "\tif (napi_typeof(env, args[1], &valuetype1) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\tif (type != napi_number) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_number error\");\n" + + "\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", \"第valuetype1个参数必须是数字\");\n" + + "\t\treturn result;\n" + + "\t}\n" + + "\n" + + "\tint value1 = 0;\n" + + "\n" + + "\tsize_t bufferSize = MAX_BUFFER_SIZE;\n" + + "\tsize_t realSize = 0;\n" + + "\tif (napi_get_value_int32(env, args[1], &value1) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_int32 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\n" + + "\t// 调用原始类方法\n" + + "\tTestFunc(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\t\n" + + "\treturn result;\n" + + "};\n" + + "napi_property_descriptor funcDesc[] = {\n" + + "\t{ \"testFuncPromise\", nullptr, testFuncPromiseNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "};\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n"; @Test void getInterfaceContent() { diff --git a/src/intellij_plugin/ohosgen/src/test/java/gen/GenNapiCppFileTest3.java b/src/intellij_plugin/ohosgen/src/test/java/gen/GenNapiCppFileTest3.java index 337e7a4b..898460d5 100644 --- a/src/intellij_plugin/ohosgen/src/test/java/gen/GenNapiCppFileTest3.java +++ b/src/intellij_plugin/ohosgen/src/test/java/gen/GenNapiCppFileTest3.java @@ -47,9 +47,11 @@ class GenNapiCppFileTest3 { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + "\t\treturn nullptr;\n" + - "\t};\n\n" + + "\t};\n" + + "\n" + "\tnapi_valuetype valuetype0;\n" + "\tif (napi_typeof(env, args[0], &valuetype0) != napi_ok) {\n" + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + @@ -69,7 +71,8 @@ class GenNapiCppFileTest3 { "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_string_utf8 error\");\n" + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + "\t\treturn result;\n" + - "\t};\n\n" + + "\t};\n" + + "\n" + "\tnapi_valuetype valuetype1;\n" + "\tif (napi_typeof(env, args[1], &valuetype1) != napi_ok) {\n" + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + @@ -94,16 +97,65 @@ class GenNapiCppFileTest3 { "\n" + "\t// 调用原始类方法\n" + "\tTestFunc(NAPI_PARAM_EXPRESSION);\n" + - "\t// 创建返回参数\n\t\n" + + "\t// 创建返回参数\n" + + "\t\n" + "\treturn result;\n" + "};\n" + "napi_property_descriptor funcDesc[] = {\n" + "\t{ \"testFunc\", nullptr, testFuncNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + "};\n" + - "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);"; - - private String testFuncContent2 = "\nstd::string ToCapital(std::string str, int length = 0);\n" + - "napi_value toCapitalNapi(napi_env env, napi_callback_info info)\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n" + + "\n" + + "struct testFuncAsyncData {\n" + + "\tnapi_async_work work;\t\t\t// 异步工作句柄\n" + + "\tnapi_deferred deferred;\t\t\t// Promise句柄(如果使用Promise)\n" + + "\tnapi_ref callback_ref;\t\t\t// JS回调引用\n" + + "\tstring name;\n" + + "\tnumber age;\n" + + "\tvoid result;\t\t\t// 返回值\n" + + "\tnapi_status status;\t\t\t// 执行状态\n" + + "};\n" + + "\n" + + "// 实际执行计算的线程池任务\n" + + "void testFuncAsyncExecuteWork(napi_env env, void* data) {\n" + + "\ttestFuncAsyncData* async_data = static_cast(data);\n" + + "\t// 调用原始类方法\n" + + "\tTestFunc(name, age);\n" + + "\tasync_data->result = res; // 实际计算\n" + + "}\n" + + "\n" + + "// 计算结果返回给JS事件循环\n" + + "void testFuncAsyncCompleteWork(napi_env env, napi_status status, void* data) {\n" + + "\ttestFuncAsyncData* async_data = static_cast(data);\n" + + "\n" + + "\t// 准备回调参数\n" + + "\tnapi_value argv[2] = { nullptr };\n" + + "\tif (async_data->status == napi_ok) {\n" + + "\t\t\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t} else {\n" + + "\t\tnapi_value error_msg;\n" + + "\t\tnapi_create_string_utf8(env, \"testFuncAsync failed\", NAPI_AUTO_LENGTH, &error_msg);\n" + + "\t\tnapi_create_error(env, NULL, error_msg, &argv[1]);\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t}\n" + + "\n" + + "\t// 获取JS回调函数\n" + + "\tnapi_value callback;\n" + + "\tnapi_get_reference_value(env, async_data->callback_ref, &callback);\n" + + "\n" + + "\t// 调用回调\n" + + "\tnapi_value global;\n" + + "\tnapi_get_global(env, &global);\n" + + "\tnapi_call_function(env, global, callback, 2, argv, nullptr);\n" + + "\n" + + "\t// 清理资源\n" + + "\tnapi_delete_async_work(env, async_data->work);\n" + + "\tnapi_delete_reference(env, async_data->callback_ref);\n" + + "\tdelete async_data;\n" + + "};\n" + + "\n" + + "napi_value testFuncAsyncNapi(napi_env env, napi_callback_info info)\n" + "{\n" + "\tnapi_value result = nullptr;\n" + "\tnapi_value jsthis;\n" + @@ -116,9 +168,11 @@ class GenNapiCppFileTest3 { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + "\t\treturn nullptr;\n" + - "\t};\n\n" + + "\t};\n" + + "\n" + "\tnapi_valuetype valuetype0;\n" + "\tif (napi_typeof(env, args[0], &valuetype0) != napi_ok) {\n" + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + @@ -138,7 +192,8 @@ class GenNapiCppFileTest3 { "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_string_utf8 error\");\n" + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + "\t\treturn result;\n" + - "\t};\n\n" + + "\t};\n" + + "\n" + "\tnapi_valuetype valuetype1;\n" + "\tif (napi_typeof(env, args[1], &valuetype1) != napi_ok) {\n" + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + @@ -162,24 +217,17 @@ class GenNapiCppFileTest3 { "\t};\n" + "\n" + "\t// 调用原始类方法\n" + - "\tToCapital(NAPI_PARAM_EXPRESSION);\n" + - "\t// 创建返回参数\n\tnapi_value valueRet0;" + - "\n" + - "\tif (napi_create_string_utf8(env, args[0], realSize, &valueRet0) != napi_ok) {\n" + - "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_string_utf8 error\");\n" + - "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + - "\t\treturn result;\n" + - "\t};\n" + - "\treturn valueRet0;\n\n" + + "\tTestFunc(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\t\n" + "\treturn result;\n" + "};\n" + "napi_property_descriptor funcDesc[] = {\n" + - "\t{ \"toCapital\", nullptr, toCapitalNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "\t{ \"testFuncAsync\", nullptr, testFuncAsyncNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + "};\n" + - "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);"; - - private String testFuncContent3 = "\nstd::string Nemw(std::string str = \"joke\", int length = 0);\n" + - "napi_value nemwNapi(napi_env env, napi_callback_info info)\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n" + + "\n" + + "napi_value testFuncPromiseNapi(napi_env env, napi_callback_info info)\n" + "{\n" + "\tnapi_value result = nullptr;\n" + "\tnapi_value jsthis;\n" + @@ -192,9 +240,11 @@ class GenNapiCppFileTest3 { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + "\t\treturn nullptr;\n" + - "\t};\n\n" + + "\t};\n" + + "\n" + "\tnapi_valuetype valuetype0;\n" + "\tif (napi_typeof(env, args[0], &valuetype0) != napi_ok) {\n" + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + @@ -214,7 +264,8 @@ class GenNapiCppFileTest3 { "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_string_utf8 error\");\n" + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + "\t\treturn result;\n" + - "\t};\n\n" + + "\t};\n" + + "\n" + "\tnapi_valuetype valuetype1;\n" + "\tif (napi_typeof(env, args[1], &valuetype1) != napi_ok) {\n" + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + @@ -238,24 +289,18 @@ class GenNapiCppFileTest3 { "\t};\n" + "\n" + "\t// 调用原始类方法\n" + - "\tNemw(NAPI_PARAM_EXPRESSION);\n" + - "\t// 创建返回参数\n\tnapi_value valueRet0;" + - "\n" + - "\tif (napi_create_string_utf8(env, args[0], realSize, &valueRet0) != napi_ok) {\n" + - "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_string_utf8 error\");\n" + - "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + - "\t\treturn result;\n" + - "\t};\n" + - "\treturn valueRet0;\n\n" + + "\tTestFunc(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\t\n" + "\treturn result;\n" + "};\n" + "napi_property_descriptor funcDesc[] = {\n" + - "\t{ \"nemw\", nullptr, nemwNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "\t{ \"testFuncPromise\", nullptr, testFuncPromiseNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + "};\n" + - "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);"; + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n"; - private String testFuncContent4 = "\nstd::string Nemw(auto str, auto length);\n" + - "napi_value nemwNapi(napi_env env, napi_callback_info info)\n" + + private String testFuncContent2 = "\nstd::string ToCapital(std::string str, int length = 0);\n" + + "napi_value toCapitalNapi(napi_env env, napi_callback_info info)\n" + "{\n" + "\tnapi_value result = nullptr;\n" + "\tnapi_value jsthis;\n" + @@ -268,29 +313,129 @@ class GenNapiCppFileTest3 { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + "\n" + - "\t// 调用原始类方法\n" + - "\tNemw(NAPI_PARAM_EXPRESSION);\n" + - "\t// 创建返回参数\n\tnapi_value valueRet0;" + + "\tnapi_valuetype valuetype0;\n" + + "\tif (napi_typeof(env, args[0], &valuetype0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\tif (type != napi_string) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_string error\");\n" + + "\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", \"第0个参数必须是字符串\");\n" + + "\t\treturn result;\n" + + "\t}\n" + + "\n" + + "\tchar* value0[MAX_BUFFER_SIZE];\n" + + "\tsize_t bufferSize = MAX_BUFFER_SIZE;\n" + + "\tsize_t realSize = 0;\n" + + "\tif (napi_get_value_string_utf8(env, args[0], &value0, bufferSize, &realSize) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\n" + + "\tnapi_valuetype valuetype1;\n" + + "\tif (napi_typeof(env, args[1], &valuetype1) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\tif (type != napi_number) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_number error\");\n" + + "\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", \"第valuetype1个参数必须是数字\");\n" + + "\t\treturn result;\n" + + "\t}\n" + + "\n" + + "\tint value1 = 0;\n" + + "\n" + + "\tsize_t bufferSize = MAX_BUFFER_SIZE;\n" + + "\tsize_t realSize = 0;\n" + + "\tif (napi_get_value_int32(env, args[1], &value1) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_int32 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + "\n" + + "\t// 调用原始类方法\n" + + "\tToCapital(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\tnapi_value valueRet0;\n" + "\tif (napi_create_string_utf8(env, args[0], realSize, &valueRet0) != napi_ok) {\n" + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_string_utf8 error\");\n" + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + "\t\treturn result;\n" + "\t};\n" + - "\treturn valueRet0;\n\n" + + "\treturn valueRet0;\n" + + "\n" + "\treturn result;\n" + "};\n" + "napi_property_descriptor funcDesc[] = {\n" + - "\t{ \"nemw\", nullptr, nemwNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "\t{ \"toCapital\", nullptr, toCapitalNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + "};\n" + - "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);"; - - private String testFuncContent5 = "\nNemw(auto str, auto length);\n" + - "napi_value nemwNapi(napi_env env, napi_callback_info info)\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n" + + "\n" + + "struct toCapitalAsyncData {\n" + + "\tnapi_async_work work;\t\t\t// 异步工作句柄\n" + + "\tnapi_deferred deferred;\t\t\t// Promise句柄(如果使用Promise)\n" + + "\tnapi_ref callback_ref;\t\t\t// JS回调引用\n" + + "\tstring str;\n" + + "\tnumber length;\n" + + "\tvoid result;\t\t\t// 返回值\n" + + "\tnapi_status status;\t\t\t// 执行状态\n" + + "};\n" + + "\n" + + "// 实际执行计算的线程池任务\n" + + "void toCapitalAsyncExecuteWork(napi_env env, void* data) {\n" + + "\ttoCapitalAsyncData* async_data = static_cast(data);\n" + + "\t// 调用原始类方法\n" + + "\tToCapital(str, length);\n" + + "\tasync_data->result = res; // 实际计算\n" + + "}\n" + + "\n" + + "// 计算结果返回给JS事件循环\n" + + "void toCapitalAsyncCompleteWork(napi_env env, napi_status status, void* data) {\n" + + "\ttoCapitalAsyncData* async_data = static_cast(data);\n" + + "\n" + + "\t// 准备回调参数\n" + + "\tnapi_value argv[2] = { nullptr };\n" + + "\tif (async_data->status == napi_ok) {\n" + + "\t\tnapi_value valueRet0;\n" + + "\tif (napi_create_string_utf8(env, args[0], realSize, &valueRet0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\treturn valueRet0;\n" + + "\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t} else {\n" + + "\t\tnapi_value error_msg;\n" + + "\t\tnapi_create_string_utf8(env, \"toCapitalAsync failed\", NAPI_AUTO_LENGTH, &error_msg);\n" + + "\t\tnapi_create_error(env, NULL, error_msg, &argv[1]);\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t}\n" + + "\n" + + "\t// 获取JS回调函数\n" + + "\tnapi_value callback;\n" + + "\tnapi_get_reference_value(env, async_data->callback_ref, &callback);\n" + + "\n" + + "\t// 调用回调\n" + + "\tnapi_value global;\n" + + "\tnapi_get_global(env, &global);\n" + + "\tnapi_call_function(env, global, callback, 2, argv, nullptr);\n" + + "\n" + + "\t// 清理资源\n" + + "\tnapi_delete_async_work(env, async_data->work);\n" + + "\tnapi_delete_reference(env, async_data->callback_ref);\n" + + "\tdelete async_data;\n" + + "};\n" + + "\n" + + "napi_value toCapitalAsyncNapi(napi_env env, napi_callback_info info)\n" + "{\n" + "\tnapi_value result = nullptr;\n" + "\tnapi_value jsthis;\n" + @@ -303,50 +448,153 @@ class GenNapiCppFileTest3 { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + "\n" + + "\tnapi_valuetype valuetype0;\n" + + "\tif (napi_typeof(env, args[0], &valuetype0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\tif (type != napi_string) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_string error\");\n" + + "\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", \"第0个参数必须是字符串\");\n" + + "\t\treturn result;\n" + + "\t}\n" + + "\n" + + "\tchar* value0[MAX_BUFFER_SIZE];\n" + + "\tsize_t bufferSize = MAX_BUFFER_SIZE;\n" + + "\tsize_t realSize = 0;\n" + + "\tif (napi_get_value_string_utf8(env, args[0], &value0, bufferSize, &realSize) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\n" + + "\tnapi_valuetype valuetype1;\n" + + "\tif (napi_typeof(env, args[1], &valuetype1) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\tif (type != napi_number) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_number error\");\n" + + "\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", \"第valuetype1个参数必须是数字\");\n" + + "\t\treturn result;\n" + + "\t}\n" + + "\n" + + "\tint value1 = 0;\n" + + "\n" + + "\tsize_t bufferSize = MAX_BUFFER_SIZE;\n" + + "\tsize_t realSize = 0;\n" + + "\tif (napi_get_value_int32(env, args[1], &value1) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_int32 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\n" + "\t// 调用原始类方法\n" + - "\tNemw(NAPI_PARAM_EXPRESSION);\n" + - "\t// 创建返回参数\n\t\n" + + "\tToCapital(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\tnapi_value valueRet0;\n" + + "\tif (napi_create_string_utf8(env, args[0], realSize, &valueRet0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\treturn valueRet0;\n" + + "\n" + "\treturn result;\n" + "};\n" + "napi_property_descriptor funcDesc[] = {\n" + - "\t{ \"nemw\", nullptr, nemwNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "\t{ \"toCapitalAsync\", nullptr, toCapitalAsyncNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + "};\n" + - "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);"; - - private String testFuncContent6 = "\ntemplate T* getArray(T* items);\n" + - "napi_value getArrayNapi(napi_env env, napi_callback_info info)\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n" + + "\n" + + "napi_value toCapitalPromiseNapi(napi_env env, napi_callback_info info)\n" + "{\n" + "\tnapi_value result = nullptr;\n" + "\tnapi_value jsthis;\n" + "\tnapi_status status;\n" + "\tnapi_get_undefined(env, &result);\n" + "\t// 获取参数\n" + - "\tsize_t argc = 1;\n" + - "\tnapi_value args[1] = {nullptr};\n" + + "\tsize_t argc = 2;\n" + + "\tnapi_value args[2] = {nullptr};\n" + "\tnapi_value this_arg;\n" + "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + - "\tif (argc < 1) {\n" + - "\t\tnapi_throw_error(env, \"EINVAL\", \"需要1个参数\");\n" + + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + "\n" + + "\tnapi_valuetype valuetype0;\n" + + "\tif (napi_typeof(env, args[0], &valuetype0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\tif (type != napi_string) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_string error\");\n" + + "\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", \"第0个参数必须是字符串\");\n" + + "\t\treturn result;\n" + + "\t}\n" + + "\n" + + "\tchar* value0[MAX_BUFFER_SIZE];\n" + + "\tsize_t bufferSize = MAX_BUFFER_SIZE;\n" + + "\tsize_t realSize = 0;\n" + + "\tif (napi_get_value_string_utf8(env, args[0], &value0, bufferSize, &realSize) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\n" + + "\tnapi_valuetype valuetype1;\n" + + "\tif (napi_typeof(env, args[1], &valuetype1) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\tif (type != napi_number) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_number error\");\n" + + "\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", \"第valuetype1个参数必须是数字\");\n" + + "\t\treturn result;\n" + + "\t}\n" + + "\n" + + "\tint value1 = 0;\n" + + "\n" + + "\tsize_t bufferSize = MAX_BUFFER_SIZE;\n" + + "\tsize_t realSize = 0;\n" + + "\tif (napi_get_value_int32(env, args[1], &value1) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_int32 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\n" + "\t// 调用原始类方法\n" + - "\tgetArray(NAPI_PARAM_EXPRESSION);\n" + - "\t// 创建返回参数\n\t\n" + + "\tToCapital(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\tnapi_value valueRet0;\n" + + "\tif (napi_create_string_utf8(env, args[0], realSize, &valueRet0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\treturn valueRet0;\n" + + "\n" + "\treturn result;\n" + "};\n" + "napi_property_descriptor funcDesc[] = {\n" + - "\t{ \"getArray\", nullptr, getArrayNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "\t{ \"toCapitalPromise\", nullptr, toCapitalPromiseNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + "};\n" + - "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);"; + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n"; - private String testFuncContent7 = "\ntemplate void displayType(T id, U name);\n" + - "napi_value displayTypeNapi(napi_env env, napi_callback_info info)\n" + + private String testFuncContent3 = "\nstd::string Nemw(std::string str = \"joke\", int length = 0);\n" + + "napi_value nemwNapi(napi_env env, napi_callback_info info)\n" + "{\n" + "\tnapi_value result = nullptr;\n" + "\tnapi_value jsthis;\n" + @@ -359,19 +607,860 @@ class GenNapiCppFileTest3 { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + "\n" + - "\t// 调用原始类方法\n" + - "\tdisplayType(NAPI_PARAM_EXPRESSION);\n" + - "\t// 创建返回参数\n\t\n" + - "\treturn result;\n" + - "};\n" + - "napi_property_descriptor funcDesc[] = {\n" + + "\tnapi_valuetype valuetype0;\n" + + "\tif (napi_typeof(env, args[0], &valuetype0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\tif (type != napi_string) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_string error\");\n" + + "\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", \"第0个参数必须是字符串\");\n" + + "\t\treturn result;\n" + + "\t}\n" + + "\n" + + "\tchar* value0[MAX_BUFFER_SIZE];\n" + + "\tsize_t bufferSize = MAX_BUFFER_SIZE;\n" + + "\tsize_t realSize = 0;\n" + + "\tif (napi_get_value_string_utf8(env, args[0], &value0, bufferSize, &realSize) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\n" + + "\tnapi_valuetype valuetype1;\n" + + "\tif (napi_typeof(env, args[1], &valuetype1) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\tif (type != napi_number) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_number error\");\n" + + "\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", \"第valuetype1个参数必须是数字\");\n" + + "\t\treturn result;\n" + + "\t}\n" + + "\n" + + "\tint value1 = 0;\n" + + "\n" + + "\tsize_t bufferSize = MAX_BUFFER_SIZE;\n" + + "\tsize_t realSize = 0;\n" + + "\tif (napi_get_value_int32(env, args[1], &value1) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_int32 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\n" + + "\t// 调用原始类方法\n" + + "\tNemw(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\tnapi_value valueRet0;\n" + + "\tif (napi_create_string_utf8(env, args[0], realSize, &valueRet0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\treturn valueRet0;\n" + + "\n" + + "\treturn result;\n" + + "};\n" + + "napi_property_descriptor funcDesc[] = {\n" + + "\t{ \"nemw\", nullptr, nemwNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "};\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n" + + "\n" + + "struct nemwAsyncData {\n" + + "\tnapi_async_work work;\t\t\t// 异步工作句柄\n" + + "\tnapi_deferred deferred;\t\t\t// Promise句柄(如果使用Promise)\n" + + "\tnapi_ref callback_ref;\t\t\t// JS回调引用\n" + + "\tstring str;\n" + + "\tnumber length;\n" + + "\tvoid result;\t\t\t// 返回值\n" + + "\tnapi_status status;\t\t\t// 执行状态\n" + + "};\n" + + "\n" + + "// 实际执行计算的线程池任务\n" + + "void nemwAsyncExecuteWork(napi_env env, void* data) {\n" + + "\tnemwAsyncData* async_data = static_cast(data);\n" + + "\t// 调用原始类方法\n" + + "\tNemw(str, length);\n" + + "\tasync_data->result = res; // 实际计算\n" + + "}\n" + + "\n" + + "// 计算结果返回给JS事件循环\n" + + "void nemwAsyncCompleteWork(napi_env env, napi_status status, void* data) {\n" + + "\tnemwAsyncData* async_data = static_cast(data);\n" + + "\n" + + "\t// 准备回调参数\n" + + "\tnapi_value argv[2] = { nullptr };\n" + + "\tif (async_data->status == napi_ok) {\n" + + "\t\tnapi_value valueRet0;\n" + + "\tif (napi_create_string_utf8(env, args[0], realSize, &valueRet0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\treturn valueRet0;\n" + + "\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t} else {\n" + + "\t\tnapi_value error_msg;\n" + + "\t\tnapi_create_string_utf8(env, \"nemwAsync failed\", NAPI_AUTO_LENGTH, &error_msg);\n" + + "\t\tnapi_create_error(env, NULL, error_msg, &argv[1]);\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t}\n" + + "\n" + + "\t// 获取JS回调函数\n" + + "\tnapi_value callback;\n" + + "\tnapi_get_reference_value(env, async_data->callback_ref, &callback);\n" + + "\n" + + "\t// 调用回调\n" + + "\tnapi_value global;\n" + + "\tnapi_get_global(env, &global);\n" + + "\tnapi_call_function(env, global, callback, 2, argv, nullptr);\n" + + "\n" + + "\t// 清理资源\n" + + "\tnapi_delete_async_work(env, async_data->work);\n" + + "\tnapi_delete_reference(env, async_data->callback_ref);\n" + + "\tdelete async_data;\n" + + "};\n" + + "\n" + + "napi_value nemwAsyncNapi(napi_env env, napi_callback_info info)\n" + + "{\n" + + "\tnapi_value result = nullptr;\n" + + "\tnapi_value jsthis;\n" + + "\tnapi_status status;\n" + + "\tnapi_get_undefined(env, &result);\n" + + "\t// 获取参数\n" + + "\tsize_t argc = 2;\n" + + "\tnapi_value args[2] = {nullptr};\n" + + "\tnapi_value this_arg;\n" + + "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + + "\t// 参数校验\n" + + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + + "\t\treturn nullptr;\n" + + "\t};\n" + + "\n" + + "\tnapi_valuetype valuetype0;\n" + + "\tif (napi_typeof(env, args[0], &valuetype0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\tif (type != napi_string) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_string error\");\n" + + "\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", \"第0个参数必须是字符串\");\n" + + "\t\treturn result;\n" + + "\t}\n" + + "\n" + + "\tchar* value0[MAX_BUFFER_SIZE];\n" + + "\tsize_t bufferSize = MAX_BUFFER_SIZE;\n" + + "\tsize_t realSize = 0;\n" + + "\tif (napi_get_value_string_utf8(env, args[0], &value0, bufferSize, &realSize) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\n" + + "\tnapi_valuetype valuetype1;\n" + + "\tif (napi_typeof(env, args[1], &valuetype1) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\tif (type != napi_number) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_number error\");\n" + + "\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", \"第valuetype1个参数必须是数字\");\n" + + "\t\treturn result;\n" + + "\t}\n" + + "\n" + + "\tint value1 = 0;\n" + + "\n" + + "\tsize_t bufferSize = MAX_BUFFER_SIZE;\n" + + "\tsize_t realSize = 0;\n" + + "\tif (napi_get_value_int32(env, args[1], &value1) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_int32 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\n" + + "\t// 调用原始类方法\n" + + "\tNemw(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\tnapi_value valueRet0;\n" + + "\tif (napi_create_string_utf8(env, args[0], realSize, &valueRet0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\treturn valueRet0;\n" + + "\n" + + "\treturn result;\n" + + "};\n" + + "napi_property_descriptor funcDesc[] = {\n" + + "\t{ \"nemwAsync\", nullptr, nemwAsyncNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "};\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n" + + "\n" + + "napi_value nemwPromiseNapi(napi_env env, napi_callback_info info)\n" + + "{\n" + + "\tnapi_value result = nullptr;\n" + + "\tnapi_value jsthis;\n" + + "\tnapi_status status;\n" + + "\tnapi_get_undefined(env, &result);\n" + + "\t// 获取参数\n" + + "\tsize_t argc = 2;\n" + + "\tnapi_value args[2] = {nullptr};\n" + + "\tnapi_value this_arg;\n" + + "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + + "\t// 参数校验\n" + + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + + "\t\treturn nullptr;\n" + + "\t};\n" + + "\n" + + "\tnapi_valuetype valuetype0;\n" + + "\tif (napi_typeof(env, args[0], &valuetype0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\tif (type != napi_string) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_string error\");\n" + + "\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", \"第0个参数必须是字符串\");\n" + + "\t\treturn result;\n" + + "\t}\n" + + "\n" + + "\tchar* value0[MAX_BUFFER_SIZE];\n" + + "\tsize_t bufferSize = MAX_BUFFER_SIZE;\n" + + "\tsize_t realSize = 0;\n" + + "\tif (napi_get_value_string_utf8(env, args[0], &value0, bufferSize, &realSize) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\n" + + "\tnapi_valuetype valuetype1;\n" + + "\tif (napi_typeof(env, args[1], &valuetype1) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\tif (type != napi_number) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_number error\");\n" + + "\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", \"第valuetype1个参数必须是数字\");\n" + + "\t\treturn result;\n" + + "\t}\n" + + "\n" + + "\tint value1 = 0;\n" + + "\n" + + "\tsize_t bufferSize = MAX_BUFFER_SIZE;\n" + + "\tsize_t realSize = 0;\n" + + "\tif (napi_get_value_int32(env, args[1], &value1) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_int32 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\n" + + "\t// 调用原始类方法\n" + + "\tNemw(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\tnapi_value valueRet0;\n" + + "\tif (napi_create_string_utf8(env, args[0], realSize, &valueRet0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\treturn valueRet0;\n" + + "\n" + + "\treturn result;\n" + + "};\n" + + "napi_property_descriptor funcDesc[] = {\n" + + "\t{ \"nemwPromise\", nullptr, nemwPromiseNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "};\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n"; + + private String testFuncContent4 = "\nstd::string Nemw(auto str, auto length);\n" + + "napi_value nemwNapi(napi_env env, napi_callback_info info)\n" + + "{\n" + + "\tnapi_value result = nullptr;\n" + + "\tnapi_value jsthis;\n" + + "\tnapi_status status;\n" + + "\tnapi_get_undefined(env, &result);\n" + + "\t// 获取参数\n" + + "\tsize_t argc = 2;\n" + + "\tnapi_value args[2] = {nullptr};\n" + + "\tnapi_value this_arg;\n" + + "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + + "\t// 参数校验\n" + + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + + "\t\treturn nullptr;\n" + + "\t};\n" + + "\n" + + "\t// 调用原始类方法\n" + + "\tNemw(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\tnapi_value valueRet0;\n" + + "\tif (napi_create_string_utf8(env, args[0], realSize, &valueRet0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\treturn valueRet0;\n" + + "\n" + + "\treturn result;\n" + + "};\n" + + "napi_property_descriptor funcDesc[] = {\n" + + "\t{ \"nemw\", nullptr, nemwNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "};\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n" + + "\n" + + "struct nemwAsyncData {\n" + + "\tnapi_async_work work;\t\t\t// 异步工作句柄\n" + + "\tnapi_deferred deferred;\t\t\t// Promise句柄(如果使用Promise)\n" + + "\tnapi_ref callback_ref;\t\t\t// JS回调引用\n" + + "\tauto str;\n" + + "\tauto length;\n" + + "\tvoid result;\t\t\t// 返回值\n" + + "\tnapi_status status;\t\t\t// 执行状态\n" + + "};\n" + + "\n" + + "// 实际执行计算的线程池任务\n" + + "void nemwAsyncExecuteWork(napi_env env, void* data) {\n" + + "\tnemwAsyncData* async_data = static_cast(data);\n" + + "\t// 调用原始类方法\n" + + "\tNemw(str, length);\n" + + "\tasync_data->result = res; // 实际计算\n" + + "}\n" + + "\n" + + "// 计算结果返回给JS事件循环\n" + + "void nemwAsyncCompleteWork(napi_env env, napi_status status, void* data) {\n" + + "\tnemwAsyncData* async_data = static_cast(data);\n" + + "\n" + + "\t// 准备回调参数\n" + + "\tnapi_value argv[2] = { nullptr };\n" + + "\tif (async_data->status == napi_ok) {\n" + + "\t\tnapi_value valueRet0;\n" + + "\tif (napi_create_string_utf8(env, args[0], realSize, &valueRet0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\treturn valueRet0;\n" + + "\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t} else {\n" + + "\t\tnapi_value error_msg;\n" + + "\t\tnapi_create_string_utf8(env, \"nemwAsync failed\", NAPI_AUTO_LENGTH, &error_msg);\n" + + "\t\tnapi_create_error(env, NULL, error_msg, &argv[1]);\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t}\n" + + "\n" + + "\t// 获取JS回调函数\n" + + "\tnapi_value callback;\n" + + "\tnapi_get_reference_value(env, async_data->callback_ref, &callback);\n" + + "\n" + + "\t// 调用回调\n" + + "\tnapi_value global;\n" + + "\tnapi_get_global(env, &global);\n" + + "\tnapi_call_function(env, global, callback, 2, argv, nullptr);\n" + + "\n" + + "\t// 清理资源\n" + + "\tnapi_delete_async_work(env, async_data->work);\n" + + "\tnapi_delete_reference(env, async_data->callback_ref);\n" + + "\tdelete async_data;\n" + + "};\n" + + "\n" + + "napi_value nemwAsyncNapi(napi_env env, napi_callback_info info)\n" + + "{\n" + + "\tnapi_value result = nullptr;\n" + + "\tnapi_value jsthis;\n" + + "\tnapi_status status;\n" + + "\tnapi_get_undefined(env, &result);\n" + + "\t// 获取参数\n" + + "\tsize_t argc = 2;\n" + + "\tnapi_value args[2] = {nullptr};\n" + + "\tnapi_value this_arg;\n" + + "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + + "\t// 参数校验\n" + + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + + "\t\treturn nullptr;\n" + + "\t};\n" + + "\n" + + "\t// 调用原始类方法\n" + + "\tNemw(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\tnapi_value valueRet0;\n" + + "\tif (napi_create_string_utf8(env, args[0], realSize, &valueRet0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\treturn valueRet0;\n" + + "\n" + + "\treturn result;\n" + + "};\n" + + "napi_property_descriptor funcDesc[] = {\n" + + "\t{ \"nemwAsync\", nullptr, nemwAsyncNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "};\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n" + + "\n" + + "napi_value nemwPromiseNapi(napi_env env, napi_callback_info info)\n" + + "{\n" + + "\tnapi_value result = nullptr;\n" + + "\tnapi_value jsthis;\n" + + "\tnapi_status status;\n" + + "\tnapi_get_undefined(env, &result);\n" + + "\t// 获取参数\n" + + "\tsize_t argc = 2;\n" + + "\tnapi_value args[2] = {nullptr};\n" + + "\tnapi_value this_arg;\n" + + "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + + "\t// 参数校验\n" + + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + + "\t\treturn nullptr;\n" + + "\t};\n" + + "\n" + + "\t// 调用原始类方法\n" + + "\tNemw(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\tnapi_value valueRet0;\n" + + "\tif (napi_create_string_utf8(env, args[0], realSize, &valueRet0) != napi_ok) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_string_utf8 error\");\n" + + "\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");\n" + + "\t\treturn result;\n" + + "\t};\n" + + "\treturn valueRet0;\n" + + "\n" + + "\treturn result;\n" + + "};\n" + + "napi_property_descriptor funcDesc[] = {\n" + + "\t{ \"nemwPromise\", nullptr, nemwPromiseNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "};\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n"; + + private String testFuncContent5 = "\nNemw(auto str, auto length);\n" + + "napi_value nemwNapi(napi_env env, napi_callback_info info)\n" + + "{\n" + + "\tnapi_value result = nullptr;\n" + + "\tnapi_value jsthis;\n" + + "\tnapi_status status;\n" + + "\tnapi_get_undefined(env, &result);\n" + + "\t// 获取参数\n" + + "\tsize_t argc = 2;\n" + + "\tnapi_value args[2] = {nullptr};\n" + + "\tnapi_value this_arg;\n" + + "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + + "\t// 参数校验\n" + + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + + "\t\treturn nullptr;\n" + + "\t};\n" + + "\n" + + "\t// 调用原始类方法\n" + + "\tNemw(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\t\n" + + "\treturn result;\n" + + "};\n" + + "napi_property_descriptor funcDesc[] = {\n" + + "\t{ \"nemw\", nullptr, nemwNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "};\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n" + + "\n" + + "struct nemwAsyncData {\n" + + "\tnapi_async_work work;\t\t\t// 异步工作句柄\n" + + "\tnapi_deferred deferred;\t\t\t// Promise句柄(如果使用Promise)\n" + + "\tnapi_ref callback_ref;\t\t\t// JS回调引用\n" + + "\tauto str;\n" + + "\tauto length;\n" + + "\tvoid result;\t\t\t// 返回值\n" + + "\tnapi_status status;\t\t\t// 执行状态\n" + + "};\n" + + "\n" + + "// 实际执行计算的线程池任务\n" + + "void nemwAsyncExecuteWork(napi_env env, void* data) {\n" + + "\tnemwAsyncData* async_data = static_cast(data);\n" + + "\t// 调用原始类方法\n" + + "\tNemw(str, length);\n" + + "\tasync_data->result = res; // 实际计算\n" + + "}\n" + + "\n" + + "// 计算结果返回给JS事件循环\n" + + "void nemwAsyncCompleteWork(napi_env env, napi_status status, void* data) {\n" + + "\tnemwAsyncData* async_data = static_cast(data);\n" + + "\n" + + "\t// 准备回调参数\n" + + "\tnapi_value argv[2] = { nullptr };\n" + + "\tif (async_data->status == napi_ok) {\n" + + "\t\t\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t} else {\n" + + "\t\tnapi_value error_msg;\n" + + "\t\tnapi_create_string_utf8(env, \"nemwAsync failed\", NAPI_AUTO_LENGTH, &error_msg);\n" + + "\t\tnapi_create_error(env, NULL, error_msg, &argv[1]);\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t}\n" + + "\n" + + "\t// 获取JS回调函数\n" + + "\tnapi_value callback;\n" + + "\tnapi_get_reference_value(env, async_data->callback_ref, &callback);\n" + + "\n" + + "\t// 调用回调\n" + + "\tnapi_value global;\n" + + "\tnapi_get_global(env, &global);\n" + + "\tnapi_call_function(env, global, callback, 2, argv, nullptr);\n" + + "\n" + + "\t// 清理资源\n" + + "\tnapi_delete_async_work(env, async_data->work);\n" + + "\tnapi_delete_reference(env, async_data->callback_ref);\n" + + "\tdelete async_data;\n" + + "};\n" + + "\n" + + "napi_value nemwAsyncNapi(napi_env env, napi_callback_info info)\n" + + "{\n" + + "\tnapi_value result = nullptr;\n" + + "\tnapi_value jsthis;\n" + + "\tnapi_status status;\n" + + "\tnapi_get_undefined(env, &result);\n" + + "\t// 获取参数\n" + + "\tsize_t argc = 2;\n" + + "\tnapi_value args[2] = {nullptr};\n" + + "\tnapi_value this_arg;\n" + + "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + + "\t// 参数校验\n" + + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + + "\t\treturn nullptr;\n" + + "\t};\n" + + "\n" + + "\t// 调用原始类方法\n" + + "\tNemw(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\t\n" + + "\treturn result;\n" + + "};\n" + + "napi_property_descriptor funcDesc[] = {\n" + + "\t{ \"nemwAsync\", nullptr, nemwAsyncNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "};\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n" + + "\n" + + "napi_value nemwPromiseNapi(napi_env env, napi_callback_info info)\n" + + "{\n" + + "\tnapi_value result = nullptr;\n" + + "\tnapi_value jsthis;\n" + + "\tnapi_status status;\n" + + "\tnapi_get_undefined(env, &result);\n" + + "\t// 获取参数\n" + + "\tsize_t argc = 2;\n" + + "\tnapi_value args[2] = {nullptr};\n" + + "\tnapi_value this_arg;\n" + + "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + + "\t// 参数校验\n" + + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + + "\t\treturn nullptr;\n" + + "\t};\n" + + "\n" + + "\t// 调用原始类方法\n" + + "\tNemw(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\t\n" + + "\treturn result;\n" + + "};\n" + + "napi_property_descriptor funcDesc[] = {\n" + + "\t{ \"nemwPromise\", nullptr, nemwPromiseNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "};\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n"; + + private String testFuncContent6 = "\ntemplate T* getArray(T* items);\n" + + "napi_value getArrayNapi(napi_env env, napi_callback_info info)\n" + + "{\n" + + "\tnapi_value result = nullptr;\n" + + "\tnapi_value jsthis;\n" + + "\tnapi_status status;\n" + + "\tnapi_get_undefined(env, &result);\n" + + "\t// 获取参数\n" + + "\tsize_t argc = 1;\n" + + "\tnapi_value args[1] = {nullptr};\n" + + "\tnapi_value this_arg;\n" + + "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + + "\t// 参数校验\n" + + "\tif (argc < 1) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 1 error\");\n" + + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要1个参数\");\n" + + "\t\treturn nullptr;\n" + + "\t};\n" + + "\n" + + "\t// 调用原始类方法\n" + + "\tgetArray(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\t\n" + + "\treturn result;\n" + + "};\n" + + "napi_property_descriptor funcDesc[] = {\n" + + "\t{ \"getArray\", nullptr, getArrayNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "};\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n" + + "\n" + + "struct getArrayAsyncData {\n" + + "\tnapi_async_work work;\t\t\t// 异步工作句柄\n" + + "\tnapi_deferred deferred;\t\t\t// Promise句柄(如果使用Promise)\n" + + "\tnapi_ref callback_ref;\t\t\t// JS回调引用\n" + + "\tT[] items;\n" + + "\tvoid result;\t\t\t// 返回值\n" + + "\tnapi_status status;\t\t\t// 执行状态\n" + + "};\n" + + "\n" + + "// 实际执行计算的线程池任务\n" + + "void getArrayAsyncExecuteWork(napi_env env, void* data) {\n" + + "\tgetArrayAsyncData* async_data = static_cast(data);\n" + + "\t// 调用原始类方法\n" + + "\tgetArray(items);\n" + + "\tasync_data->result = res; // 实际计算\n" + + "}\n" + + "\n" + + "// 计算结果返回给JS事件循环\n" + + "void getArrayAsyncCompleteWork(napi_env env, napi_status status, void* data) {\n" + + "\tgetArrayAsyncData* async_data = static_cast(data);\n" + + "\n" + + "\t// 准备回调参数\n" + + "\tnapi_value argv[2] = { nullptr };\n" + + "\tif (async_data->status == napi_ok) {\n" + + "\t\t\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t} else {\n" + + "\t\tnapi_value error_msg;\n" + + "\t\tnapi_create_string_utf8(env, \"getArrayAsync failed\", NAPI_AUTO_LENGTH, &error_msg);\n" + + "\t\tnapi_create_error(env, NULL, error_msg, &argv[1]);\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t}\n" + + "\n" + + "\t// 获取JS回调函数\n" + + "\tnapi_value callback;\n" + + "\tnapi_get_reference_value(env, async_data->callback_ref, &callback);\n" + + "\n" + + "\t// 调用回调\n" + + "\tnapi_value global;\n" + + "\tnapi_get_global(env, &global);\n" + + "\tnapi_call_function(env, global, callback, 2, argv, nullptr);\n" + + "\n" + + "\t// 清理资源\n" + + "\tnapi_delete_async_work(env, async_data->work);\n" + + "\tnapi_delete_reference(env, async_data->callback_ref);\n" + + "\tdelete async_data;\n" + + "};\n" + + "\n" + + "napi_value getArrayAsyncNapi(napi_env env, napi_callback_info info)\n" + + "{\n" + + "\tnapi_value result = nullptr;\n" + + "\tnapi_value jsthis;\n" + + "\tnapi_status status;\n" + + "\tnapi_get_undefined(env, &result);\n" + + "\t// 获取参数\n" + + "\tsize_t argc = 1;\n" + + "\tnapi_value args[1] = {nullptr};\n" + + "\tnapi_value this_arg;\n" + + "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + + "\t// 参数校验\n" + + "\tif (argc < 1) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 1 error\");\n" + + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要1个参数\");\n" + + "\t\treturn nullptr;\n" + + "\t};\n" + + "\n" + + "\t// 调用原始类方法\n" + + "\tgetArray(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\t\n" + + "\treturn result;\n" + + "};\n" + + "napi_property_descriptor funcDesc[] = {\n" + + "\t{ \"getArrayAsync\", nullptr, getArrayAsyncNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "};\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n" + + "\n" + + "napi_value getArrayPromiseNapi(napi_env env, napi_callback_info info)\n" + + "{\n" + + "\tnapi_value result = nullptr;\n" + + "\tnapi_value jsthis;\n" + + "\tnapi_status status;\n" + + "\tnapi_get_undefined(env, &result);\n" + + "\t// 获取参数\n" + + "\tsize_t argc = 1;\n" + + "\tnapi_value args[1] = {nullptr};\n" + + "\tnapi_value this_arg;\n" + + "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + + "\t// 参数校验\n" + + "\tif (argc < 1) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 1 error\");\n" + + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要1个参数\");\n" + + "\t\treturn nullptr;\n" + + "\t};\n" + + "\n" + + "\t// 调用原始类方法\n" + + "\tgetArray(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\t\n" + + "\treturn result;\n" + + "};\n" + + "napi_property_descriptor funcDesc[] = {\n" + + "\t{ \"getArrayPromise\", nullptr, getArrayPromiseNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "};\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n"; + + private String testFuncContent7 = "\ntemplate void displayType(T id, U name);\n" + + "napi_value displayTypeNapi(napi_env env, napi_callback_info info)\n" + + "{\n" + + "\tnapi_value result = nullptr;\n" + + "\tnapi_value jsthis;\n" + + "\tnapi_status status;\n" + + "\tnapi_get_undefined(env, &result);\n" + + "\t// 获取参数\n" + + "\tsize_t argc = 2;\n" + + "\tnapi_value args[2] = {nullptr};\n" + + "\tnapi_value this_arg;\n" + + "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + + "\t// 参数校验\n" + + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + + "\t\treturn nullptr;\n" + + "\t};\n" + + "\n" + + "\t// 调用原始类方法\n" + + "\tdisplayType(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\t\n" + + "\treturn result;\n" + + "};\n" + + "napi_property_descriptor funcDesc[] = {\n" + "\t{ \"displayType\", nullptr, displayTypeNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + "};\n" + - "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);"; + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n" + + "\n" + + "struct displayTypeAsyncData {\n" + + "\tnapi_async_work work;\t\t\t// 异步工作句柄\n" + + "\tnapi_deferred deferred;\t\t\t// Promise句柄(如果使用Promise)\n" + + "\tnapi_ref callback_ref;\t\t\t// JS回调引用\n" + + "\tT id;\n" + + "\tU name;\n" + + "\tvoid result;\t\t\t// 返回值\n" + + "\tnapi_status status;\t\t\t// 执行状态\n" + + "};\n" + + "\n" + + "// 实际执行计算的线程池任务\n" + + "void displayTypeAsyncExecuteWork(napi_env env, void* data) {\n" + + "\tdisplayTypeAsyncData* async_data = static_cast(data);\n" + + "\t// 调用原始类方法\n" + + "\tdisplayType(id, name);\n" + + "\tasync_data->result = res; // 实际计算\n" + + "}\n" + + "\n" + + "// 计算结果返回给JS事件循环\n" + + "void displayTypeAsyncCompleteWork(napi_env env, napi_status status, void* data) {\n" + + "\tdisplayTypeAsyncData* async_data = static_cast(data);\n" + + "\n" + + "\t// 准备回调参数\n" + + "\tnapi_value argv[2] = { nullptr };\n" + + "\tif (async_data->status == napi_ok) {\n" + + "\t\t\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t} else {\n" + + "\t\tnapi_value error_msg;\n" + + "\t\tnapi_create_string_utf8(env, \"displayTypeAsync failed\", NAPI_AUTO_LENGTH, &error_msg);\n" + + "\t\tnapi_create_error(env, NULL, error_msg, &argv[1]);\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t}\n" + + "\n" + + "\t// 获取JS回调函数\n" + + "\tnapi_value callback;\n" + + "\tnapi_get_reference_value(env, async_data->callback_ref, &callback);\n" + + "\n" + + "\t// 调用回调\n" + + "\tnapi_value global;\n" + + "\tnapi_get_global(env, &global);\n" + + "\tnapi_call_function(env, global, callback, 2, argv, nullptr);\n" + + "\n" + + "\t// 清理资源\n" + + "\tnapi_delete_async_work(env, async_data->work);\n" + + "\tnapi_delete_reference(env, async_data->callback_ref);\n" + + "\tdelete async_data;\n" + + "};\n" + + "\n" + + "napi_value displayTypeAsyncNapi(napi_env env, napi_callback_info info)\n" + + "{\n" + + "\tnapi_value result = nullptr;\n" + + "\tnapi_value jsthis;\n" + + "\tnapi_status status;\n" + + "\tnapi_get_undefined(env, &result);\n" + + "\t// 获取参数\n" + + "\tsize_t argc = 2;\n" + + "\tnapi_value args[2] = {nullptr};\n" + + "\tnapi_value this_arg;\n" + + "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + + "\t// 参数校验\n" + + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + + "\t\treturn nullptr;\n" + + "\t};\n" + + "\n" + + "\t// 调用原始类方法\n" + + "\tdisplayType(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\t\n" + + "\treturn result;\n" + + "};\n" + + "napi_property_descriptor funcDesc[] = {\n" + + "\t{ \"displayTypeAsync\", nullptr, displayTypeAsyncNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "};\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n" + + "\n" + + "napi_value displayTypePromiseNapi(napi_env env, napi_callback_info info)\n" + + "{\n" + + "\tnapi_value result = nullptr;\n" + + "\tnapi_value jsthis;\n" + + "\tnapi_status status;\n" + + "\tnapi_get_undefined(env, &result);\n" + + "\t// 获取参数\n" + + "\tsize_t argc = 2;\n" + + "\tnapi_value args[2] = {nullptr};\n" + + "\tnapi_value this_arg;\n" + + "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + + "\t// 参数校验\n" + + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + + "\t\treturn nullptr;\n" + + "\t};\n" + + "\n" + + "\t// 调用原始类方法\n" + + "\tdisplayType(NAPI_PARAM_EXPRESSION);\n" + + "\t// 创建返回参数\n" + + "\t\n" + + "\treturn result;\n" + + "};\n" + + "napi_property_descriptor funcDesc[] = {\n" + + "\t{ \"displayTypePromise\", nullptr, displayTypePromiseNapi, nullptr, nullptr, nullptr, napi_default, nullptr },\n" + + "};\n" + + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n"; private String testStructContent1 = "\nstruct TestStruct {\n" + "\tstd::string name;\n" + @@ -421,6 +1510,7 @@ class GenNapiCppFileTest3 { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + @@ -578,6 +1668,7 @@ class GenNapiCppFileTest3 { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + @@ -736,6 +1827,7 @@ class GenNapiCppFileTest3 { "\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);\n" + "\t// 参数校验\n" + "\tif (argc < 2) {\n" + + "\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < 2 error\");\n" + "\t\tnapi_throw_error(env, \"EINVAL\", \"需要2个参数\");\n" + "\t\treturn nullptr;\n" + "\t};\n" + -- Gitee