背景
- ets需要调用cronet的preconnect接口,接口里面我定义了number和array<string>两个参数,基础类型napi都有相应解决办法,但是array数组如何获取一直没有明确的文档说明,我这里通过自己实验后说明下如何获取ets的array内容
ets与C++关系
- 每个C++鸿蒙项目,都有个oh-package.json5文件,里面配置了so对应的native层对应的ets接口。
- ets所有接口声明的函数参数,经过native转换后,最后参数都会变成napi_callback_info一个参数,我们需要通过napi_get_cb_info解析出每个参数内容。例如下面
//ets层
function preConnectStreams(num: number, urls: Array<string>): number;
//native c++接口
napi_value PreConnectStreams(napi_env env, napi_callback_info info)
- 如何配置ets和c++符号映射关系可以看官网介绍
C++层如何获取array<string>
- 通过napi_get_cb_info获取到 napi_value数组内容后,我这里知道函数只能传递2个函数,所以声明大小是2,你可以根据自己函数参数个数进行说明。
size_t argc = 2;
napi_value args[2] = {nullptr};
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
- 在获取napi_value 里面的内容后,现在就是需要将napi_value转成array可以让我们读取里面的值。首先要获取数组的长度,然后我们通过for循环可以通过napi_get_element读取数组里面的值。拿到的值也是napi_value 来的,我们需要通过其他napi转成具体类型,我下面是通过GetStringFromValueUtf8转成utf-8编码的字符串。
bool isArray;
napi_is_array(env, args[1], &isArray);
//做安全校验保护
if (!isArray) {
HILOGI("magic PreConnectStreams param is not array.");
return;
}
uint32_t array_length;
napi_get_array_length(env, args[1], &array_length);
for (uint32_t index = 0; index < array_length; ++index) {
napi_value name = nullptr;
if (napi_get_element(env, args[1], index, &name) != napi_ok) {
continue;
}
napi_valuetype valueType = napi_undefined;
napi_typeof(env, value, &valueType)
if (valueType != napi_string) {
continue;
}
size_t stringszise = 0;
napi_get_value_string_utf8(env, name, nullptr, 0 , &stringszise);
std::string valueString;
valueString.resize(stringszise+1);
napi_get_value_string_utf8(env, name, &valueString[0], stringszise+1, &stringszise);
PreConnectStreamsImpl(num, valueString);
}
总结
- 鸿蒙开发大部分和android类似的,只不过ets语法还不熟悉,边写边学可以更快上手
- 菜鸡还是要多努力学习总结
补充array相关的napi相关截图