问题现象
业务需要在ets中调用C++的方法,其中的一个参数是std::string类型,但是将ArkTS传进来string类型的参数转为std::string类型时,类型强转报错。
错误代码如下:
char *faceDetectModelDirChar;
napi_get_value_string_utf8(env, args[0], faceDetectModelDirChar, 0, &length);
// 将char*转为std::string类型
std::string faceDetectModelDir = faceDetectModelDirChar;
问题定位
对比官网指导文档和错误代码,发现错误代码中将获取字符串长度和字符串内容放在同一次调用中,和官方指导中先获取字符串长度,再获取字符串内容不一致。
分析结论
错误代码对Node-API的接口使用不正确,napi_get_value_string_utf8需要先获取字符串长度后再获取字符串内容给指定对象。
修改建议
参照指导文档修改:
- 先调用napi_get_value_string_utf8获取字符串的长度;
- 分配字符串的存储空间,需要包含'\0'占用的空间;
- 再次调用napi_get_value_string_utf8获取字符串的内容;
- 最后将字符串转换为std::string类型。