Andorid的NDK
2025-11-27
5
0
NDK 通常指的是 Android Native Development Kit。
这是一个非常重要的概念,特别是对于 Android 开发者或需要在 Android 系统上进行底层开发的人员。
核心定义
Android NDK 是一个工具集,允许您使用 C 和 C++ 等原生代码来实现 Android 应用的部分功能。
简单来说:
- SDK 让您用 Java 或 Kotlin 开发 Android 应用。
- NDK 让您用 C 或 C++ 开发 Android 应用的一部分。
主要用途和目的
NDK通常用于以下特定场景:
- 提升性能: 对性能要求极高的部分,如图形渲染、物理模拟、复杂的数学计算(如信号处理),使用 C/C++ 代码可以更好地利用 CPU 并实现优化,从而获得比 Java 更高的效率。
- 代码复用: 重用已有的、用 C/C++ 编写的开源库或公司自己的核心库。例如,FFmpeg(视频处理)、OpenCV(计算机视觉)、SQLite(数据库)等。
- 底层硬件操作: 进行更直接的硬件访问或调用一些特定的底层 API,这在纯 Java 层可能无法实现或效率低下。
- 平台差异性: 在某些极少数情况下,绕过 Android 的 Java 框架,直接与 Linux 内核交互。
NDK 包含哪些关键组件?
当您在 Linux 上下载并安装 NDK 后,您会得到:
- 交叉编译工具链: 这是核心。它包含
gcc或clang编译器、链接器等。这些工具运行在您的 Linux 开发机上,但生成的二进制文件是给 ARM 或 x86 架构的 Android 设备使用的。 - 原生 API 头文件: 定义了您可以在 C/C++ 代码中使用的 Android 特定原生 API,例如:
- liblog: 提供
__android_log_print函数,用于在 Logcat 中输出日志。 - libandroid: 提供对 NativeActivity 等的支持。
- OpenSL ES: 用于高性能、低延迟的音频。
- Vulkan: 用于高性能 3D 图形。
- liblog: 提供
- 构建工具: 主要是
ndk-build和 CMake。它们用于将您的 C/C++ 源代码编译成共享库(.so文件)或静态库(.a文件)。 - 系统库: Android 系统自身的部分 C/C++ 库的稳定版本,供您链接使用。
- 调试工具: 如
ndk-gdb,用于调试原生代码。
工作流程简介
- 您用 C/C++ 编写代码,并包含相应的 Android NDK 头文件。
- 使用 NDK 提供的交叉编译工具链和构建系统(如 CMake),在 Linux 电脑上将 C/C++ 代码编译成
.so动态库。 - 在您的 Android Java/Kotlin 应用中,通过 JNI 来加载这个
.so库并调用其中的原生函数。 - 最终,APK 中将包含这个编译好的原生库,并在 Android 设备上运行。
一个简单的例子:Hello World
原生代码 (C++):hello.cpp
编译为 libmyhellolib.so
#include <jni.h> //jni.h: JNI 头文件,提供了与 Java 交互所需的类型和函数声明
#include <string>
extern "C" //确保 C++ 编译器按 C 风格处理函数名,
JNIEXPORT //宏定义,表示这个函数需要导出给 Java 调用
jstring //JNI 字符串类型,对应 Java 的 String
JNICALL //指定函数调用约定
Java_com_example_myapp_MainActivity_stringFromJNI( //Java_包名_类名_方法名
JNIEnv* env, // JNI 环境指针,提供访问 JNI 功能的函数
jobject /* this */){ // 对应 Java 中的 this 对象(MainActivity 实例)
std::string hello = "Hello from C++ in Linux NDK";
return env->NewStringUTF(hello.c_str()); //将 C++ 字符串转换为 JNI 字符串格式
}
Java 代码:MainActivity.java
在Java中调用libmyhellolib.so的方法
package com.example.myapp;
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("myhellolib"); // 加载编译生成的 libmyhellolib.so
}
public native String stringFromJNI(); // 声明c++函数原生方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//调用本地方法
TextView tv = findViewById(R.id.sample_text);
tv.setText(stringFromJNI()); // 调用 C++ 函数
}
}
总结
对于 Linux 用户或开发者而言,NDK 就是一个在 Linux 开发环境中,用来为 Android 这个基于 Linux 内核的操作系统编译 C/C++ 代码的工具包。
- 平台: 运行在 Linux(或 Windows/macOS)上。
- 目标: 生成运行在 Android(一个移动端 Linux 系统)上的原生库。
- 价值: 在性能、代码复用和底层访问方面,为 Android 开发提供了强大的扩展能力。
ARM&Linux基础





