ARM&Linux基础
+ -

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通常用于以下特定场景:

  1. 提升性能: 对性能要求极高的部分,如图形渲染、物理模拟、复杂的数学计算(如信号处理),使用 C/C++ 代码可以更好地利用 CPU 并实现优化,从而获得比 Java 更高的效率。
  2. 代码复用: 重用已有的、用 C/C++ 编写的开源库或公司自己的核心库。例如,FFmpeg(视频处理)、OpenCV(计算机视觉)、SQLite(数据库)等。
  3. 底层硬件操作: 进行更直接的硬件访问或调用一些特定的底层 API,这在纯 Java 层可能无法实现或效率低下。
  4. 平台差异性: 在某些极少数情况下,绕过 Android 的 Java 框架,直接与 Linux 内核交互。

NDK 包含哪些关键组件?

当您在 Linux 上下载并安装 NDK 后,您会得到:

  • 交叉编译工具链: 这是核心。它包含 gccclang 编译器、链接器等。这些工具运行在您的 Linux 开发机上,但生成的二进制文件是给 ARMx86 架构的 Android 设备使用的。
  • 原生 API 头文件: 定义了您可以在 C/C++ 代码中使用的 Android 特定原生 API,例如:
    • liblog: 提供 __android_log_print 函数,用于在 Logcat 中输出日志。
    • libandroid: 提供对 NativeActivity 等的支持。
    • OpenSL ES: 用于高性能、低延迟的音频。
    • Vulkan: 用于高性能 3D 图形。
  • 构建工具: 主要是 ndk-build 和 CMake。它们用于将您的 C/C++ 源代码编译成共享库(.so 文件)或静态库(.a 文件)。
  • 系统库: Android 系统自身的部分 C/C++ 库的稳定版本,供您链接使用。
  • 调试工具: 如 ndk-gdb,用于调试原生代码。

工作流程简介

  1. 您用 C/C++ 编写代码,并包含相应的 Android NDK 头文件。
  2. 使用 NDK 提供的交叉编译工具链和构建系统(如 CMake),在 Linux 电脑上将 C/C++ 代码编译成 .so 动态库。
  3. 在您的 Android Java/Kotlin 应用中,通过 JNI 来加载这个 .so 库并调用其中的原生函数。
  4. 最终,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 开发提供了强大的扩展能力。

0 篇笔记 写笔记

Andorid的NDK
NDK 通常指的是 Android Native Development Kit。这是一个非常重要的概念,特别是对于 Android 开发者或需要在 Android 系统上进行底层开发的人员。核心定义Android NDK 是一个工具集,允许您使用 C 和 C++ 等原生代码来实现 Androi......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!