自学内容网 自学内容网

Harmony next Native API 开发工程实践

旨在通过文档,了解华为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完全兼容。


原文地址:https://blog.csdn.net/cyuyanshujujiegou/article/details/142561814

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!