0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙next开发-OpenHarmony的NDK开发

jf_46214456 来源:jf_46214456 作者:jf_46214456 2024-01-20 11:35 次阅读

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

Native API相关资料

  • Native API参考,介绍各个API参考手册
  • Native API中支持的标准库,介绍Native API支持的开源标准库
  • Native API开发指南,结合具体的例子,场景介绍各类接口的使用
  • 如何在Cmake工程中使用NDK,介绍如何使用使用NDK开发一个CMake工程
  • Node-API在应用工程中的使用指导, 如何使用Node-API接口

简单应用

如何开发应用?

  • DevEco IDE创建工程选择“Native C++”模板:

image.png

image.png

编译运行后,点击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对应的库文件和头文件;

image.png

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

使用建议

建议使用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部分就没有编译出来;

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7639

    浏览量

    148485
  • SDK
    SDK
    +关注

    关注

    3

    文章

    966

    浏览量

    44696
  • 鸿蒙
    +关注

    关注

    55

    文章

    1629

    浏览量

    42119
  • HarmonyOS
    +关注

    关注

    79

    文章

    1831

    浏览量

    29261
  • OpenHarmony
    +关注

    关注

    23

    文章

    3288

    浏览量

    15159
收藏 人收藏

    评论

    相关推荐

    今日看点丨华为 HarmonyOS NEXT 鸿蒙星河版第四季度商用;博世计划2026年底前裁员1200人

    1. 华为 HarmonyOS NEXT 鸿蒙星河版第四季度商用,第二季度启动开发者 Beta   在鸿蒙生态千帆启航仪式,华为宣布 HarmonyOS
    发表于 01-19 10:47 852次阅读

    鸿蒙千帆起】《钢岚》成为首款基于HarmonyOS NEXT开发的战棋新游

    近日,紫龙游戏旗下 BlackJack 工作室全新战棋旗舰作品《钢岚》在华为游戏中心首发上线,并宣布《钢岚》完成鸿蒙原生应用开发,成为基于 HarmonyOS NEXT 开发的首款战棋
    发表于 12-28 10:24

    鸿蒙开发OpenHarmony组件复用案例

    ) } }, item => item) } } } 本文主要是对鸿蒙开发基础当中的OpenHarmony技术组件复用示例, 更多鸿蒙开发
    发表于 01-15 17:37

    鸿蒙不再兼容安卓,那么鸿蒙开发者是否会大增?

    。以上为略缩版图册,如果需要高清完整的可以在主页4或https://qr23.cn/AKFP8k保存。 内容涵盖:(文档形式) OpenHarmony入门基础 OpenHarmony核心技能 OpenHarmony高级技能
    发表于 01-31 22:17

    鸿蒙实战项目开发:【短信服务】

    两位前阿里高级研发工程师联合打造的 《鸿蒙NEXT星河版OpenHarmony开发文档》 里面内容包含了(ArkTS、ArkUI开发组件、S
    发表于 03-03 21:29

    深圳市24年,实现鸿蒙原生应用数占全国总量10%以上

    。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。它由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版
    发表于 03-04 21:42

    关于6678的NDK开发的问题linkstatus

    专家您好:        以前我使用6455DSP做NDK开发的时候,使用的是ndk2.0,在NDK\..\example\network\client\dsk6455\dsk6455
    发表于 06-21 15:06

    迅为RK3568开发鸿蒙OpenHarmony系统固件烧写步骤

    1、迅为RK3568开发鸿蒙OpenHarmony系统固件烧写首先拷贝烧写器(烧写器在光盘资料“iTOP-3568 开发板\01_【iTOP-RK3568
    发表于 08-26 17:45

    openharmony鸿蒙有什么关系

    ,让平板、手机、智能家居都可以通过建房子搭积木的方式来使用鸿蒙系统。 openharmony鸿蒙之间属于相辅相成的,可以说openharmony就是建设
    的头像 发表于 06-22 16:02 1.1w次阅读

    华为开发者分论坛HarmonyOS学生公开课-如何提交到开源鸿蒙OpenHarmony代码仓

    2021华为开发者分论坛HarmonyOS学生公开课-如何提交到开源鸿蒙OpenHarmony代码仓
    的头像 发表于 10-24 10:00 1794次阅读
    华为<b class='flag-5'>开发</b>者分论坛HarmonyOS学生公开课-如何提交到开源<b class='flag-5'>鸿蒙</b><b class='flag-5'>OpenHarmony</b>代码仓

    淘宝与华为合作将基于HarmonyOS NEXT启动鸿蒙原生应用开发

    1月25日,淘宝与华为举办鸿蒙合作签约仪式,宣布将基于HarmonyOS NEXT启动鸿蒙原生应用开发
    的头像 发表于 01-26 16:14 559次阅读

    华为宣布HarmonyOS NEXT鸿蒙星河版开发者预览面向开发者开放申请

    华为宣布HarmonyOS NEXT鸿蒙星河版开发者预览面向开发者开放申请,这意味着鸿蒙生态进入第二阶段,将加速千行百业的应用
    的头像 发表于 01-29 16:42 738次阅读
    华为宣布HarmonyOS <b class='flag-5'>NEXT</b><b class='flag-5'>鸿蒙</b>星河版<b class='flag-5'>开发</b>者预览面向<b class='flag-5'>开发</b>者开放申请

    鸿蒙开发教程

    去年8 月份华为发布会上,华为发布了HarmonyOS NEXT预览版,宣布不再兼容安卓应用。大家期待的纯血鸿蒙终于要来临了,next 预览版本现在已经开放申请渠道了,Next
    的头像 发表于 01-31 17:11 322次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>教程

    《详解:鸿蒙NEXT开发核心技术》

    我们现在都知道鸿蒙作为一个国产的全栈自研系统,经过国家主推后。已经引起人们很大的关注,其中作为开发者来说;许多一线大厂已经与其华为鸿蒙展开原生应用的合作了,目前了解到已经有200+家。而之后出现了很多的高薪
    的头像 发表于 03-13 23:00 333次阅读
    《详解:<b class='flag-5'>鸿蒙</b><b class='flag-5'>NEXT</b><b class='flag-5'>开发</b>核心技术》

    鸿蒙开发实例:【配置OpenHarmony SDK】

    在设置OpenHarmony应用开发环境时,需要开发者在DevEco Studio中配置对应的SDK信息。
    的头像 发表于 04-22 15:24 144次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>实例:【配置<b class='flag-5'>OpenHarmony</b> SDK】