旨在通过文档,了解华为native开发中的关键节点,能够搭建一个比较实用的native功能、
目录
前言
一、napi是什么?
二、简单开始一个napi的实例
1.适配架构配置
2.新增实现
3.官方实例
4.napi与ark通讯的几种方式
Native侧的CallNative
Native call arkts
过程问题
llvm对机器的要求
napi 对比nodejs、android - ndk实现的差异
字典
Nativie API / NDK
SDK CAPI
前言
harmony next Native Api实践第一课
一、napi是什么?
ohos上谈论napi是因为,底层部分能力从node-api/napi上实现而来,部分能力跟napi本身有差异,从实际开发中来看,复用度较高。从napi向上实现,一个关键的优势在于本身napi是去除了底层的javascript引擎的差异,提供了一套稳定的接口;同时,arkts是ts的超集,node-js生态友好的napi是更好的选择。(napi在nodejs上更多的做插件开发,市面上相关实战、文章较少,这对开发者提了更高的要求)。
华为部分对napi的接口进行重新的实现,底层对接了ArkJS引擎,支持的napi标准库的部分接口:
https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V1/napi-0000001630425921-V1
Ark Node-api 支持数据类型与接口:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/napi-data-types-interfaces-0000001820880433
node-js官网部分对node api的接口定义
https://nodejs.cn/api/n-api.html
简单对比下,在node-js定义接口上,相关文档更详细、解释更详尽,华为部分简单进行了接口的梳理。更大的native建设力度放在了原生支持、opengl部分。对于端上同学来实现另一套napi实现的方式,除了要从ndk的api切换到napi中,还需要注意napi不等于ohos的native api,实际中有差异的部分需要边调试边看底层实现。受制于市面并没有比较活跃的napi相关社区、成熟库示例,投入需要提前预估到。
二、简单开始一个napi的实例
File -> createProject -> native c++ 新建项目之后,简单操作不赘述。针对实战示例来梳理在新建项目到实战需要进行哪些了解。
harmony中的工程目录与native实现:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/use-napi-process-0000001774120794
1.适配架构配置
build-profile.json5
"externalNativeOptions": {
"path": "./src/main/cpp/CMakeLists.txt",
//make 参数
"arguments": "-v -DOHOS_STL=c++_shared",
"abiFilters": [
//添加适配架构
"arm64-v8a",
"armeabi-v7a",
"x86_64"
],
"cppFlags": ""
}
2.新增实现
新增cpp/types/common文件夹,添加common.h文件,cmakelist.txt文件添加
add_library(
your_lib_name // lib name
SHARED
types/common/common.h //新增实现代码位置
)
该处使用的url网络请求的数据。
3.官方实例
https://developer.huawei.com/consumer/cn/ codelabsPortal/carddetails/tutorials_NaitveTemplate |
4.napi与ark通讯的几种方式
napi_value scriptResult;
// 构造 SHA-1 加密的 JavaScript 代码
std::string sha1Code = "import { CryptoJS } from '@ohos/crypto-js'; let result2:string = "";result2 = CryptoJS.SHA1('message');result2;";
napi_value scriptString;
napi_create_string_utf8(env, sha1Code.c_str(), NAPI_AUTO_LENGTH ,&scriptString);
// 执行 JavaScript 代码
napi_status scriptStatus = napi_run_script(env,scriptString , &scriptResult);
if (scriptStatus != napi_ok) {
safe2_string.append("Failed to execute JavaScript code");
}else{
safe2_string.append("\n脚本运行的结果: ");
safe2_string.append(napiValueToString(env, scriptResult));
safe2_string.append("\n脚本运行的结果: ending \n");
}
Native侧的CallNative
// ark调用native能力 ,通过上层引入so库、ark调用native能力来实现
static napi_value CallNative(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);
// 依次获取参数
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;
}
Native call arkts
// native 处理逻辑,通过callback回调到ark内。
static napi_value NativeCallArkTS(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);
// 创建一个int,作为ArkTS的入参
napi_value argv = nullptr;
napi_create_int32(env, 2, &argv );
// 调用传入的callback,并将其结果返回
napi_value result = nullptr;
napi_call_function(env, nullptr, args[0], 1, &argv, &result);
return result;
}
过程问题
llvm对机器的要求
针对ndk生成的so库,需通过harmony提供的llvm进行重新生成:
https://gitee.com/openharmony/docs/blob/master/zh-cn/release-notes/OpenHarmony-v4.0-release.md#https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F4.0-Release%2Fohos-sdk-mac-public.tar.gz
harmony部分,mac支持机器暂时只有mac老款、mac m1,新款部分暂无工具库。
mac老款需要升级系统,升级安装xcode_command_line工具,升级安装ld.lld工具库(llvm系统依赖)。
非harmony库动态库,线上预编译库-https://conan.io/
编译中问题参考 - https://juejin.cn/post/7295276751595339828
编译多个linux包
napi 对比nodejs、android - ndk实现的差异
已有ndk库的改写,需要同时注意ndk与ohos - napi、 napi的差异。在nodejs napi部分标准实现需要对标ohos实现,未完全对齐部分需要适配。 Android ndk部分数据类型、通讯、声明、cmake、llvm编译、依赖、架构都有比较大的差异。
字典
Nativie API / NDK
OHOS SDK里面native包提供的,面向三方应用开发的Native 接口以及相应编译脚本,编译工具链。包括C运行时基础库libc,3D图形库opengl,面向JS与C跨语言的接口Node-API。 NDK - Native Develop Kit的缩写,在OHOS上就是Native API;Native API是官方名字,NDK指代相同意思。
SDK CAPI
OHOS Native API中的C语言接口,以及工具链部分,当前OHOS的Native API里面只包含C语言接口,因此Native API与CAPI意思一样,建议交流的时候使用CAPI,防止Native API与napi缩写混用。
Node-API / napi
曾用名napi,是OHOS中提供JS与C跨语言调用的接口,是Native API接口中的一部分. 该接口在Node.js提供的Node-API基础上扩展而来,但不完全与Node.js中的Node-API完全兼容。