NDK 入门指南

原生开发工具包 (NDK) 是一套工具,允许您为 Android 使用 C 和 C++ 代码,并提供众多平台库,您可用其管理原生 Activity 和访问物理设备组件,例如传感器和触摸输入。NDK 可能不适合大多数 Android 编程初学者,这些初学者只需使用 Java 代码和框架 API 来开发应用。然而,如果您需要完成一或多个以下事项,那么 NDK 就能派上用场:

  • 进一步提升设备性能,以实现低延迟时间,或运行计算密集型应用,如游戏或物理模拟。
  • 重复使用您自己或其他开发者的 C 或 C++ 库。

您可以借助 Android Studio 2.2 或更高版本,使用 NDK 将 C 和 C++ 代码编译到原生库中,然后使用 IDE 集成构建系统 Gradle 将您的库封装入 APK。然后,Java 代码可以通过 Java 原生接口 (JNI) 框架,调用您原生库中的函数。如需了解有关 Gradle 和 Android 构建系统的更多信息,请参阅配置构建

Android Studio 用于编译原生库的默认构建工具是 CMake。由于很多现有项目都使用构建工具包,因此 Android Studio 也支持 ndk-build。不过,如果您要创建新的原生库,则应使用 CMake。

本指南提供在 Android Studio 中建立和运行 NDK 所需的信息。如果您没有最新版 Android Studio,现在就下载安装

实验性 Gradle 的用户注意事项:如果您是以下任意一种情况,请考虑迁移到插件版本 2.2.0 或更高版本并使用 CMake 或 ndk-build 构建原生库:您的原生项目已经使用 CMake 或者 ndk-build;但是您想要使用稳定版本的 Gradle 构建系统;或者您希望支持插件工具,例如 CCache。否则,您可以继续使用实验性版本的 Gradle 和 Android 插件

下载 NDK 和工具

要为您的应用编译和调试原生代码,您需要以下组件:

  • Android 原生开发工具包 (NDK):这套工具允许您为 Android 使用 C 和 C++ 代码。
  • CMake:一款外部构建工具,可与 Gradle 搭配使用来构建原生库。如果您只计划使用 ndk-build,则不需要此组件。
  • LLDB:一种调试程序,Android Studio 使用它来调试原生代码。

您可以使用 SDK 管理器安装这些组件:

  1. 在打开的项目中,从主菜单选择 Tools > Android > SDK Manager
  2. 点击 SDK Tools 标签。
  3. 勾选 LLDBCMakeNDK 旁的复选框,如图 1 所示。

    图 1. 从 SDK 管理器中安装 LLDB、CMake 和 NDK。

  4. 点击 Apply,然后在下一个对话框中点击 OK
  5. 安装完成后,点击 Finish,然后点击 OK

创建或导入原生项目

Android Studio 设置完成后,只需创建支持 C/C++ 的新项目。但如果您想添加或导入原生代码至现有 Android Studio 项目,则需要按以下基本流程操作:

  1. 创建新的原生源文件并将其添加到您的 Android Studio 项目中。
    • 如果您已经拥有原生代码或想要导入预构建的原生库,则可以跳过此步骤。
  2. 创建 CMake 构建脚本,告知 CMake 如何将您的原生源文件构建入库。如果导入和关联预构建库或平台库,您也需要此构建脚本。
    • 如果您现有的原生库已有 CMakeLists.txt 构建脚本,或使用 ndk-build 并包括 Android.mk 构建脚本,则可跳过此步骤。
  3. 通过提供指向您 CMake 或 ndk-build 脚本文件的路径,将 Gradle 关联到您的原生库。Gradle 使用构建脚本将源代码导入您的 Android Studio 项目并将原生库(SO 文件)打包到 APK 中。

    注:如果您现有的项目使用已弃用的 ndkCompile 工具,在配置 Gradle 使用 CMake 或 ndk-build 之前,应首先打开您的 build.properties 文件,并移除以下代码行:

    // Remove this line
    android.useDeprecatedNdk = true
    
  4. 点击 Run 从主菜单运行应用构建和运行您的应用。Gradle 会以依赖项的形式添加您的 CMake 或 ndk-build 流程,用于编译、构建原生库并将其随 APK 一起打包。

应用开始在物理设备或模拟器上运行后,您即可使用 Android Studio 调试您的应用。如需了解关于 NDK 及其组件的更多信息,请参阅概念页。