赞
踩
Native API是OpenHarmony SDK上提供的一组native开发接口与工具集合(也称为NDK),方便开发者使用C或者C++语言实现应用的关键功能。Native API只覆盖了OHOS基础的一些底层能力,如libc,图形库,窗口系统,多媒体,压缩库等,并没有完全提供类似于JS API上的完整的OHOS 平台能力。在应用中使用Native API会编译成动态库打包到应用中。
名词 | 名词解释 |
---|---|
Native API | 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,是OHOS中提供JS与C跨语言调用的接口,是Native API接口中的一部分. 该接口在Node.js提供的Node-API基础上扩展而来,但不完全与Node.js中的Node-API完全兼容。 |
napi | Node-API的曾用名,当前Node-API头文件中的接口仍然以napi_开头,不建议使用。 |
Native API在SDK包的位置为$(SDK_ROOT)/native目录,主要有以下几个部分组成
目录 | 功能说明 |
---|---|
build | 应用中编译动态库的toolchain cmake脚本;这个目录下ohos.toolchain.cmake文件定义了给OHOS交叉编译选项 |
build-tools | 放置编译构建的工具,如cmake |
docs | Native API接口参考文档,通过doxgen从头文件中提取出来 |
llvm | 支持OHOS ABI的llvm交叉编译器 |
sysroot | 放置编译链接的依赖文件目录,包含头文件,动态库等 |
接口分类 | 接口功能 | 引入版本 |
---|---|---|
标准C库 | 以musl为基础提供的标准c库接口,当前提供了1500+的接口 | 8 |
标准C++库 | c运行时库libc_shared,此库在打包的时候需要打包或者静态链接到应用中 | 8 |
日志 | 打印日志到系统的hilog接口 | 8 |
Node-API | ArkUI提供的,方便应用开发接入JS应用环境的一组类Node-API(也叫napi),是属于Native API的一部分 | 8 |
XComponent | ArkUI XComponent组件中的surface与触屏事件接口,方便开发者开发高性能图形应用 | 8 |
libuv | ArkUI集成的三方的异步IO库 | 8 |
libz | zlib库,提供基本的压缩,解压接口 | 8 |
Drawing | 系统提供的2D图形库,可以在surface进行绘制 | 8 |
OpenGL | 系统提供的openglv3接口 | 8 |
Rawfile | 应用资源访问接口,可以读取应用中打包的各种资源 | 8 |
OpenSLES | 用于2D,3D音频加速的接口库 | 8 |
Mindspore | AI模型接口库 | 9 |
包管理 | 包服务接口,方便查询应用包信息 | 8 |
编译运行后,点击helloworld打印输出有:Test NAPI 2 + 3 = 5
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%') } }
# 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)
#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); }
上面例子运行起来后,c++部分是没有打印信息的,若想看到对应的打印信息,则需要调用hilog进行输出,修改如下:
# 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)
// 增加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对应的库文件和头文件;
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
主要有如下一些
更多内容分享见主页
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。