鸿蒙Harmony开发指南:Native API开发

背景

Native API(NDK)入门

Native API是OpenHarmony SDK上提供的一组native开发接口与工具集合(也称为NDK),方便开发者使用C或者C++语言实现应用的关键功能。Native API只覆盖了OHOS基础的一些底层能力,如libc,图形库,窗口系统,多媒体,压缩库等,并没有完全提供类似于JS API上的完整的OHOS 平台能力。在应用中使用Native API会编译成动态库打包到应用中。

名词概念
名词名词解释
Native APIOHOS SDK里面native包提供的,面向三方应用开发的Native 接口以及相应编译脚本,编译工具链。包括C运行时基础库libc,3D图形库opengl,面向JS与C跨语言的接口Node-API等,具体内容详见下表。
NDKNative Develop Kit的缩写,在OHOS上就是Native API;Native API是官方名字,NDK指代相同意思。
SDK CAPIOHOS Native API中的C语言接口,以及工具链部分,当前OHOS的Native API里面只包含C语言接口,因此Native API与CAPI意思一样,建议交流的时候使用CAPI,防止Native API与napi缩写混用。
Node-API曾用名napi,是OHOS中提供JS与C跨语言调用的接口,是Native API接口中的一部分. 该接口在Node.js提供的Node-API基础上扩展而来,但不完全与Node.js中的Node-API完全兼容。
napiNode-API的曾用名,当前Node-API头文件中的接口仍然以napi_开头,不建议使用。

Native API构成介绍

Native API目录结构

Native API在SDK包的位置为$(SDK_ROOT)/native目录,主要有以下几个部分组成

目录功能说明
build应用中编译动态库的toolchain cmake脚本;这个目录下ohos.toolchain.cmake文件定义了给OHOS交叉编译选项
build-tools放置编译构建的工具,如cmake
docsNative API接口参考文档,通过doxgen从头文件中提取出来
llvm支持OHOS ABI的llvm交叉编译器
sysroot放置编译链接的依赖文件目录,包含头文件,动态库等

Native API接口(4.0 Release)

接口分类接口功能引入版本
标准C库以musl为基础提供的标准c库接口,当前提供了1500+的接口8
标准C++库c运行时库libc_shared,此库在打包的时候需要打包或者静态链接到应用中8
日志打印日志到系统的hilog接口8
Node-APIArkUI提供的,方便应用开发接入JS应用环境的一组类Node-API(也叫napi),是属于Native API的一部分8
XComponentArkUI XComponent组件中的surface与触屏事件接口,方便开发者开发高性能图形应用8
libuvArkUI集成的三方的异步IO库8
libzzlib库,提供基本的压缩,解压接口8
Drawing系统提供的2D图形库,可以在surface进行绘制8
OpenGL系统提供的openglv3接口8
Rawfile应用资源访问接口,可以读取应用中打包的各种资源8
OpenSLES用于2D,3D音频加速的接口库8
MindsporeAI模型接口库9
包管理包服务接口,方便查询应用包信息8

简单应用

如何开发应用?
  • DevEco IDE创建工程选择“Native C++”模板:

    #星计划# 浅谈OpenHarmony的NDK开发-鸿蒙开发者社区

#星计划# 浅谈OpenHarmony的NDK开发-鸿蒙开发者社区

编译运行后,点击helloworld打印输出有:Test NAPI 2 + 3 = 5

  • ArkUI部分:

    import hilog from '@ohos.hilog';           //导入hilog
    import testNapi from 'libentry.so';		   //导入nativeC++模块
    
    @Entry
    @Component
    struct Index {
      @State message: string = 'Hello World';
    
      build() {
        Row() {
          Column() {
            Text(this.message)
              .fontSize(50)
              .fontWeight(FontWeight.Bold)
              .onClick(() => {
                //调用nativeC++代码
                hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3));
              })
          }
          .width('100%')
        }
        .height('100%')
      }
    }
    
  • nativeC部分由 CMake 和 C代码两部分组成:

    • CMake:

      # the minimum version of CMake.
      cmake_minimum_required(VERSION 3.4.1)
      project(MyNDKApplication)
      # 编译路径
      set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
      # 编译头文件路径
      include_directories(${NATIVERENDER_ROOT_PATH}
                          ${NATIVERENDER_ROOT_PATH}/include)
      # 编译对象entry是对应用层可见的so,即import testNapi from 'libentry.so'
      add_library(entry SHARED hello.cpp)
      # 这是link命令,libace_napi 这个就是node-api需要用的so库;
      target_link_libraries(entry PUBLIC libace_napi.z.so)
      
    • C++:

      #include "napi/native_api.h"
      // 对外node-api方法,对应testNapi.add(2, 3)
      static napi_value Add(napi_env env, napi_callback_info info)
      {
          size_t requireArgc = 2;
          size_t argc = 2;
          napi_value args[2] = {nullptr};
      
          napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);
      
          napi_valuetype valuetype0;
          napi_typeof(env, args[0], &valuetype0);
      
          napi_valuetype valuetype1;
          napi_typeof(env, args[1], &valuetype1);
      
          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;
      
      }
      // 模块初始化方法,对应的方法在这加入对外描述队列
      EXTERN_C_START
      static napi_value Init(napi_env env, napi_value exports)
      {
          napi_property_descriptor desc[] = {
              { "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr }
          };
          napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
          return exports;
      }
      EXTERN_C_END
      // 模块声明,import时候调用
      static napi_module demoModule = {
          .nm_version = 1,
          .nm_flags = 0,
          .nm_filename = nullptr,
          .nm_register_func = Init,
          .nm_modname = "entry",
          .nm_priv = ((void*)0),
          .reserved = { 0 },
      };
      // 模块入口注册
      extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
      {
          napi_module_register(&demoModule);
      }
      
如何使用系统NDK?

上面例子运行起来后,c++部分是没有打印信息的,若想看到对应的打印信息,则需要调用hilog进行输出,修改如下:

  • cmake修改:

    # the minimum version of CMake.
    cmake_minimum_required(VERSION 3.4.1)
    project(MyNDKApplication)
    
    set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
    
    include_directories(${NATIVERENDER_ROOT_PATH}
                        ${NATIVERENDER_ROOT_PATH}/include)
    # 增加hiloglib库引用
    find_library(
        # Sets the name of the path variable.
        hilog-lib
        # Specifies the name of the NDK library that
        # you want CMake to locate.
        hilog_ndk.z
    )
    
    add_library(entry SHARED hello.cpp)
    # 增加hiloglib库连接
    target_link_libraries(entry PUBLIC ${hilog-lib} libace_napi.z.so)
    
  • c++文件修改:

    // 增加hilog头文件
    #include <hilog/log.h>
    #include "napi/native_api.h"
    
    static napi_value Add(napi_env env, napi_callback_info info)
    {
        // 增加打印输出
        const unsigned int LOG_PRINT_DOMAIN = 0xFF00;
        OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "Init", "Init begins");
        size_t requireArgc = 2;
        size_t argc = 2;
        napi_value args[2] = {nullptr};
        
    ...
    
  • 输出:

    08-07 05:40:25.079  15167-15167  A0ff00/Init                    com.example.myndkapplication    I  Init begins
    08-07 05:40:25.079  15167-15167  A00000/testTag                 com.example.myndkapplication    I  Test NAPI 2 + 3 = 5
    
具体原理是什么?

1、PC端OHOS SDK里包括了native对应的库文件和头文件;

#星计划# 浅谈OpenHarmony的NDK开发-鸿蒙开发者社区

2、OHOS源码可以编译出带NDK的FullSDK,也可以从CI网址下载;

# Generate NDK library from NDK description file.
#
# Variables:
#  ndk_description_file:
#  min_compact_version: string specifies the minimal compactible version of NDK.
#    set to major_version in default.
#
template("ohos_ndk_library") {
  forward_variables_from(invoker, [ "testonly" ])
  assert(defined(invoker.ndk_description_file),
         "ndk description file is necessary ")
...
// 在GN里用ohos_ndk_library生成ndk库和头文件,如
    
ohos_ndk_library("libhilog_ndk") {
  output_name = "hilog_ndk"
  ndk_description_file = "./libhilog.ndk.json"
  min_compact_version = "1"
  system_capability = "SystemCapability.HiviewDFX.HiLog"
}

ohos_ndk_headers("hilog_header") {
  dest_dir = "$ndk_headers_out_dir/hilog"
  sources = [ "./include/hilog/log.h" ]
} 

// ndk_description_file 对应的 libhilog.ndk.json 文件里声明了导出的接口函数
[
    {
        "name": "OH_LOG_Print"
    },
    {
        "name": "OH_LOG_IsLoggable"
    }
]

// ohos 编译fullsdk的命令: ./build.sh --product-name ohos-sdk

ohos的ci网址如下:每日构建 | OpenHarmony CI

#星计划# 浅谈OpenHarmony的NDK开发-鸿蒙开发者社区

使用建议

建议使用Native API的场景

主要有如下一些

  1. 应用性能敏感代码,比如游戏,物理模拟等计算密集型场景
  2. 需要复用已有的C或C++库
  3. 需要针对CPU特性进行专项定制的库,如neon加速
不建议使用Native API的场景
  1. 写一个纯native的的OHOS应用
  2. 希望在尽可能多的OHOS设备上保持兼容的应用
维测能力
  1. OHOS官方提供lldb remote方式代码调试,详细参看lldb参考手册
  2. musl库的log维测能力,请参看libc库维测章节。

总结

  • NDK方式是应用层直接调用底层库或者三方库目前看最常规的方式;
  • 4.0(API10)有ndk 46个,3.2(API9)有ndk 28个,实质代码里有更多的ndk,RK的原因没有编出更多,比如sensor部分就没有编译出来;
  • 划重点,NDK里有两种api:node-api,用于arkts和c调用和传递数据;c/c api,可以把动态库打包成应用侧c++直接调用的接口;

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为资料太多,太杂,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

为了确保高效学习,建议规划清晰的学习路线,涵盖以下关键阶段:

 点击→【纯血版鸿蒙全套最新学习资料】希望这一份鸿蒙学习资料能够给大家带来帮助~


 鸿蒙(HarmonyOS NEXT)最新学习路线

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

点击→纯血版全套鸿蒙HarmonyOS学习资料

2.视频学习资料+学习PDF文档

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、(南向驱动、嵌入式等)鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

HarmonyOS Next 最新全套视频教程

​​

 (鸿蒙语法ArkTS、TypeScript、ArkUI教程……)

 纯血版鸿蒙全套学习资料(面试、文档、全套视频等)

                   

鸿蒙南向开发技术

​​

鸿蒙APP开发必备

​​

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

​​

《鸿蒙开发基础》

​​

《鸿蒙开发进阶》

《鸿蒙进阶实战》

​​


点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值