赞
踩
在前 3 小结笔者简单介绍了 NAPI 工程并对生成的源码进行了简单介绍,本节笔者在前 3 小节的基础上对 NAPI 工程做个扩展,再额外添加一个计算 MD5 的方法 md5()
。
在 index.d.ts 文件中声明一个 md5()
方法,该方法接收一个 string 参数,返回类型也是 string 类型,表示经过 MD5 计算后的值,样例代码如下所示:
export const add: (a: number, b: number) => number;
// 声明 md5 方法
export const md5: (value: string) => string;
在前 3 节的介绍中我们知道,JS 端声明的方法由 C++ 端实现时需要把两端的方法做个映射,因此先在 hello.cpp 的 Init()
方法内设置 md5()
方法为 C++ 的 Md5()
方法,样例代码如下所示:
static napi_value Init(napi_env env, napi_value exports)
{
napi_property_descriptor desc[] = {
{ "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr },
// 设置JS的md5()方法的C++实现为Md5()方法,其它参数默认即可
{ "md5", nullptr, Md5, nullptr, nullptr, nullptr, napi_default, nullptr }
};
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
return exports;
}
在 Init()
方法中配置了 C++ 的 Md5()
方法后,需要实现 Md5()
方法,样例代码如下所示:
static napi_value Md5(napi_env env, napi_callback_info info) { // 1、从info中取出JS传递过来的参数放入args size_t argc = 1; napi_value args[1] = { nullptr }; if (napi_ok != napi_get_cb_info(env, info, &argc, args, nullptr, nullptr)) { napi_throw_error(env, "-1000", "napi_get_cb_info error"); return nullptr; } // 2、获取参数的类型 napi_valuetype stringType; if (napi_ok != napi_typeof(env, args[0], &stringType)) { napi_throw_error(env, "-1001", "napi_typeof error"); return nullptr; } // 3、如果参数为null,则抛异常 if (napi_null == stringType) { napi_throw_error(env, "-1002", "the param can't be null"); return nullptr; } // 4、获取传递的string长度 size_t length = 0; if (napi_ok != napi_get_value_string_utf8(env, args[0], nullptr, 0, &length)) { napi_throw_error(env, "-1003", "napi_get_value_string_utf8 error"); return nullptr; } // 5、如果传递的是"",则抛异常 if (length == 0) { napi_throw_error(env, "-1004", "the param length invalid"); return nullptr; } // 6、读取传递的string参数放入buffer中 char* buffer = new char[length + 1]; if (napi_ok != napi_get_value_string_utf8(env, args[0], buffer, length + 1, &length)) { delete[] buffer; buffer = nullptr; napi_throw_error(env, "-1005", "napi_get_value_string_utf8 error"); return nullptr; } // 7、模拟MD5加密操作,直接给传递进来的string后追加[NAPI] std::string str = buffer; str = str + "[NAPI]"; // 8、把C++数据转成napi_value napi_value value = nullptr; const char* md5 = str.c_str(); if (napi_ok != napi_create_string_utf8(env, md5, strlen(md5), &value)) { delete[] buffer; buffer = nullptr; napi_throw_error(env, "-1006", "napi_create_string_utf8 error"); return nullptr; } // 9、资源清理 delete[] buffer; buffer = nullptr; // 返回 value return value; }
Md5()
方法的解释说明的很清楚:第 1 步从 napi_callback_info
中读取传递进来的参数放入 args
中;第 2 步读取传递的参数类型;第 3 步判断参数类型是否为 null
,如果为 null
则抛异常;第 4 步读取参数长度;第 5 步如果传递的参数为 ""
则抛异常;第 6 步根据参数长度把参数读取出来放入 buffer
里,第 7 布模拟 MD5 操作直接在参数末尾追加 [NAPI]
字符串,第 8 步把 C++ 类型转换成 napi_value
类型,第 9 布清理资源,第 10 步返回结果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。