使用 NAPI 实现加法运算
- 代码示例 :
-
#include "napi/native_api.h" // 加法函数,接受两个参数并返回它们的和 static napi_value add(napi_env env, napi_callback_info info) { size_t argc = 2; napi_value args[2] = {nullptr}; napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); napi_valuetype valuetype0; napi_typeof(env, args[0], &valuetype0); napi_valuetype valuetype1; napi_typeof(env, args[1], &valuetype1); double value0; napi_get_value_double(env, args[0], &value0); double value1; napi_get_value_double(env, args[1], &value1); napi_value sum; napi_create_double(env, value0 + value1, &sum); return sum; } // 模块初始化函数,将加法函数挂载到exports对象上 static napi_value init(napi_env env, napi_value exports) { napi_property_descriptor desc[] = {{"add", nullptr, add, nullptr, nullptr, nullptr, napi_default, nullptr}}; napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); return exports; } // 模块定义结构体 static napi_module demoModule = { .nm_version = 1, .nm_flags = 0, .nm_filename = nullptr, .nm_register_func = init, .nm_modname = "customnapi", .nm_priv = ((void *)0), .reserved = {0} }; // 模块注册函数,在加载动态库时自动调用 extern "C" __attribute__((constructor)) void registerModule(void) { napi_module_register(&demoModule); }
- 功能说明:这段代码定义了一个名为
add
的 C++ 函数,用于实现两个数字的加法运算。通过 NAPI 将该函数暴露给 ArkTS 等上层语言,使其能够在鸿蒙应用中被调用。在init
函数中,将add
函数与 ArkTS 中的add
方法进行关联,并在registerModule
函数中完成模块的注册,以便在应用启动时加载该模块。
使用 NAPI 调用 C 标准库函数
- 代码示例1 :
-
#include "napi/native_api.h" #include <math.h> // 计算两个数平方和的平方根的函数 static napi_value MyHypot(napi_env env, napi_callback_info info) { size_t argc = 2; napi_value args[2] = {nullptr}; napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); napi_valuetype valuetype0; napi_typeof(env, args[0], &valuetype0); napi_valuetype valuetype1; napi_typeof(env, args[1], &valuetype1); double value0; napi_get_value_double(env, args[0], &value0); double value1; napi_get_value_double(env, args[1], &value1); double result = hypot(value0, value1); napi_value returnValue; napi_create_double(env, result, &returnValue); return returnValue; } static napi_value Init(napi_env env, napi_value exports) { if ((nullptr == env) || (nullptr == exports)) { OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Init", "env or exports is null"); return exports; } napi_property_descriptor desc[] = {{"myHypot", nullptr, MyHypot, nullptr, nullptr, nullptr, napi_default, nullptr}}; napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); return exports; } static napi_module demoModule = { .nm_version = 1, .nm_flags = 0, .nm_filename = nullptr, .nm_register_func = Init, .nm_modname = "hello", .nm_priv = ((void *)0), .reserved = {0} }; extern "C" __attribute__((constructor)) void RegisterModule(void) { napi_module_register(&demoModule); }
- 功能说明:此示例代码利用 C++ 调用了 C 标准库中的
hypot
函数来计算两个给定数平方和的平方根,并通过 NAPI 将其封装为可供 ArkTS 调用的函数MyHypot
。在Init
函数中,将MyHypot
与 ArkTS 中的myHypot
接口进行关联,最后通过模块注册将该功能集成到鸿蒙应用中。
使用 NAPI 集成国密算法 SM4
- 代码示例 :
-
#include "napi/native_api.h" #include "sm4.h" #include "util.h" // 使用国密算法SM4加密函数 static napi_value encryptbysm4(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value args[1] = {nullptr}; napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); size_t typelen = 0; napi_get_value_string_utf8(env, args[0], nullptr, 0, &typelen); char* extcontent = new char(typelen + 1); napi_get_value_string_utf8(env, args[0], extcontent, typelen + 1, &typelen); sm4 s; s.settype(sm4::cbc); s.setkey("1234567890123456"); s.setiv("asdfghjklzxcvbnm"); std::string originstr = extcontent; std::string encryptdata = s.encrypt(originstr); util k; std::string hexstr = k.strtohex(encryptdata); const int length = hexstr.length(); char* char_array = new char(length + 1); strcpy(char_array, hexstr.c_str()); napi_value result; napi_create_string_utf8(env, char_array, length + 1, &result); delete[] char_array; return result; } // 模块初始化函数 static napi_value init(napi_env env, napi_value exports) { napi_property_descriptor desc[] = {{"encryptbysm4", nullptr, encryptbysm4, nullptr, nullptr, nullptr, napi_default, nullptr}}; napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); return exports; } // 模块定义结构体 static napi_module demoModule = { .nm_version = 1, .nm_flags = 0, .nm_filename = nullptr, .nm_register_func = init, .nm_modname = "customnapi", .nm_priv = ((void *)0), .reserved = {0} }; // 模块注册函数 extern "C" __attribute__((constructor)) void registerModule(void) { napi_module_register(&demoModule); }
- 功能说明:代码中实现了一个使用国密算法 SM4 对输入字符串进行加密的功能。通过 NAPI 将
encryptbysm4
函数暴露给上层,使其能够在鸿蒙应用中被调用,从而实现数据加密的功能。在init
函数中完成函数与接口的关联,在registerModule
函数中进行模块注册。