前言导读
各位同学大家好,从这篇文章开始,我们就开始讲我们的 鸿蒙next里面的ndk开发了,也希望大家能跟着我一起学习和完善这一块的知识点,那么废话不多说。
NDK介绍(这些是官方的说明我不写怕有些同学觉得看不懂 觉得啰嗦可以看后面的内容)
NDK(Native Development Kit)是HarmonyOS SDK提供的Native API、相应编译脚本和编译工具链的集合,方便开发者使用C或C++语言实现应用的关键功能。NDK只覆盖了HarmonyOS一些基础的底层能力,如C运行时基础库libc、图形库、窗口系统、多媒体、压缩库、面向ArkTS/JS与C跨语言的Node-API等,并没有提供ArkTS/JS API的完整能力。
运行态,开发者可以使用NDK中的Node-API接口,访问、创建、操作JS对象;也允许JS对象使用Native动态库。
NDK适用场景
适合使用NDK的场景:应用涉及如下场景时,适合采用NDK开发
- 性能敏感的场景,如游戏、物理模拟等计算密集型场景。
- 需要复用已有C或C++库的场景。
- 需要针对CPU特性进行专项定制库的场景,如Neon加速。
不建议使用NDK的场景:应用涉及如下场景时,不建议采用NDK开发
- 纯C或C++的应用。
- 希望在尽可能多的HarmonyOS设备上保持兼容的应用。
NDK必备基础知识
为顺利进行NDK开发,开发者需要先掌握必要的基本概念及基础知识。
NDK基本概念
-
曾用名NAPI,是HarmonyOS中提供ArkTS/JS与C/C++跨语言调用的接口,是NDK接口中的一部分。该接口是在Node.js提供的Node-API基础上扩展而来,但与Node.js中的Node-API不完全兼容。
-
C API
HarmonyOS NDK的曾用名,不再使用。
前置知识
-
Linux C语言编程知识
内核、libc基础库基于POSIX等标准扩展而来,掌握基本的Linux C编程知识能够更好的帮助理解HarmonyOS NDK开发。
-
CMake使用知识
CMake是HarmonyOS默认支持的构建系统。请先通过CMake官方文档了解基础用法。
-
Node Addons开发知识
ArkTS采用Node-API作为跨语言调用接口,熟悉基本的Node Addons开发模式,可以更好理解NDK中Node-API的使用。
-
Clang/LLVM编译器使用知识
具备一定的Clang/LLVM编译器基础知识,能够帮助开发者编译出更优的Native动态库。
创建ndk的工程
选择我们的 Native c++这个选项

然后输入我们的工程名字

ndk 工程目录结构 我们可以看到对比我们的多出一个我们的cpp的文件夹 里面分别有
r
napi_init.cpp c++源代码
CMakeLists.ext c++代码编译配置文件
Index.d.ts c++ 代码对外接口配置文件
oh-package.json5 c++ library工程配置文件
c++ 部分代码
ini
#include "napi/native_api.h"
static napi_value Add(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);
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
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++对外方法
typescript
export const add: (a: number, b: number) => number;
c++ 库配置文集内容
json
{
"name": "libentry.so",
"types": "./Index.d.ts",
"version": "1.0.0",
"description": "Please describe the basic information."
}
在arkts 里面调用
首先要导入我们的 libentry.so 是我们的c++编译之后的产物
javascript
import testNapi from 'libentry.so';
arkts 调用我们的c++代码
typescript
aboutToAppear(): void {
let getnumber:number=testNapi.add(2, 3);
console.log("getnnumber -- > "+getnumber);
}
我们在控制台上面看到打印成功了

我们需要注意的是因为我们的arkts 里面数据类型对比c++这种静态语言要少很多,那么他们之间互相通信数据类型是怎么对应的呢
数据类型转换
markdown
- ArkTS的`number`对应C++的`int/double`
- 字符串通过`napi_get_value_string`转换14
- 对象类型需特殊处理封装3
最后总结:
鸿蒙next的 ndk 知识的第一集我们就讲到这里,因为我也是一边学一边分享,学好我们的ndk 。我们可以用到的场景非常的多 例如我们的音视频 ffmpeg的开发,游戏引擎里面的交互也是用这个特别是unity3d 和cocos2d 都是使用c++ 和我们的arkts 通信 他们也是使用我们ndk来通信 使用cmake配置编译。所以这一块只是相当重要,我们后续也会更新一系列这类的文章和课程。今天的文章就讲到这里我们下一期再见。今天的文章就讲到这里有兴趣的 关注我B站教程 了解更多鸿蒙开发的知识 可以关注坚果派公众号 。 谢谢
课程地址
www.bilibili.com/cheese/play...
项目内容:
1 常用布局组件的学习
2 网络请求工具类封装
3 arkui 生命周期启动流程
4 日志工具类的封装
5 自定义组合组件的封装
6 路由导航跳转的使用
7 本地地数据的缓存 以及缓存工具类的封装
8 欢迎页面的实现
9 登录案例和自动登录效果实现
10 请求网络数据分页上拉加载 下拉刷新的实现
11 list数据懒加载实现
12 webview组件的使用
如果使用更多好用的鸿蒙next三方库
友情链接
harmony-utils 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类,致力于助力开发者迅速构建鸿蒙应用,能够满足各种不同的开发需求。
harmony-dialog 一款极为简单易用的零侵入弹窗,仅需一行代码即可轻松实现,无论在何处都能够轻松弹出。