在您的项目中添加 C 和 C++ 代码

通过将代码放置在项目模块中的 cpp 目录中,将 C 和 C++ 代码添加到您的 Android 项目中。构建项目时,此代码将编译成 Gradle 可以与您的应用程序打包在一起的原生库。然后,您的 Java 或 Kotlin 代码可以通过 Java 本地接口 (JNI) 调用原生库中的函数。要详细了解如何使用 JNI 框架,请阅读 Android 的 JNI 提示

Android Studio 支持 CMake,这对跨平台项目很有用。Android Studio 也支持 ndk-build,它可能比 CMake 快,但仅支持 Android。目前不支持在同一模块中同时使用 CMake 和 ndk-build

要将现有的 ndk-build 库导入到您的 Android Studio 项目中,请了解如何 将 Gradle 链接到您的原生库项目

本页面介绍如何 设置 Android Studio,包括必要的构建工具, 创建一个支持 C/C++ 的新项目,以及 将新的 C/C++ 文件添加到您的项目

如果您想将原生代码添加到现有项目中,请按照以下步骤操作:

  1. 创建新的原生源文件 并将这些文件添加到您的 Android Studio 项目中。
    • 如果您已经拥有原生代码或想要导入预构建的原生库,请跳过此步骤。
  2. 配置 CMake 以将您的原生源代码构建成库。如果您要导入并链接到预构建的库或平台库,则需要此构建脚本。
    • 如果您有一个现有的原生库,它已经有一个 CMakeLists.txt 构建脚本或使用 ndk-build 并包含一个 Android.mk 构建脚本,请跳过此步骤。
  3. 配置 Gradle,方法是提供 CMake 或 ndk-build 脚本文件的路径。Gradle 使用构建脚本将源代码导入到您的 Android Studio 项目中,并将您的原生库打包到应用程序中。

配置完项目后,可以使用 JNI 框架 从 Java 或 Kotlin 代码访问您的原生函数。要构建并运行您的应用程序,请单击 **运行** 运行,然后从菜单栏中运行应用程序

注意: 如果您的现有项目使用已弃用的 ndkCompile 工具,请迁移到使用 CMake 或 ndk-build

下载 NDK 和构建工具

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

  • Android 原生开发工具包 (NDK):一个工具集,允许您在 Android 中使用 C 和 C++ 代码。NDK 提供平台库,让您能够管理原生活动并访问物理设备组件,例如传感器和触摸输入。
  • CMake:一个外部构建工具,与 Gradle 协同工作以构建您的原生库。如果您只打算使用 ndk-build,则不需要此组件。
  • LLDB:Android Studio 中的调试器,用于 调试原生代码

有关安装这些组件的信息,请参阅 安装和配置 NDK 和 CMake

创建一个支持 C/C++ 的新项目

要创建一个支持原生代码的新项目,流程类似于 创建任何其他 Android Studio 项目,但多了一个步骤。

  1. 在向导的 **选择项目** 部分中,选择 **原生 C++** 项目类型。
  2. 单击 **下一步**。
  3. 在向导的下一部分中填写所有其他字段。
  4. 单击 **下一步**。
  5. 在向导的 **自定义 C++ 支持** 部分中,您可以使用 **C++ 标准** 字段来自定义您的项目。
    • 使用下拉列表选择要使用的 C++ 标准化版本。选择 **工具链默认值** 将使用默认的 CMake 设置。
  6. 单击 **完成**。

Android Studio 完成创建新项目后,从 IDE 的左侧打开 **项目** 窗格,并从菜单中选择 **Android** 视图。如图 1 所示,Android Studio 添加了 **cpp** 组。

图 1. 用于您的原生源代码和外部构建脚本的 Android 视图组。

注意: 此视图不反映磁盘上的实际文件层次结构,而是将类似的文件分组在一起,以简化您的项目导航。

在 **cpp** 组中,您可以找到所有原生源文件、头文件、CMake 或 ndk-build 的构建脚本以及您项目中包含的预构建库。对于新项目,Android Studio 会创建一个示例 C++ 源文件 native-lib.cpp,并将其放在应用程序模块的 src/main/cpp/ 目录中。此示例代码提供了一个简单的 C++ 函数 stringFromJNI(),该函数返回字符串 "Hello from C++"。了解如何在项目中添加更多源文件,请参阅关于如何 创建新的原生源文件 的部分。

类似于 build.gradle 文件指示 Gradle 如何构建您的应用程序,CMake 和 ndk-build 需要一个构建脚本才能知道如何构建您的原生库。对于新项目,Android Studio 会创建一个 CMake 构建脚本 CMakeLists.txt,并将其放在模块的根目录中。要详细了解此构建脚本的内容,请阅读 配置 CMake

构建并运行示例应用程序

单击 **运行** 运行,然后从菜单栏中运行应用程序 时,Android Studio 会构建并启动一个应用程序,该应用程序会在您的 Android 设备或模拟器上显示文本 "Hello from C++"。以下概述描述了构建和运行示例应用程序时发生的事件:

  1. Gradle 调用您的外部构建脚本 CMakeLists.txt
  2. CMake 按照构建脚本中的命令将 C++ 源文件 native-lib.cpp 编译成共享对象库,并将其命名为 libnative-lib.so。Gradle 然后将其打包到应用程序中。
  3. 在运行时,应用程序的 MainActivity 使用 System.loadLibrary() 加载原生库。库的原生函数 stringFromJNI() 现在可供应用程序使用。
  4. MainActivity.onCreate() 调用 stringFromJNI(),该函数返回 "Hello from C++" 并使用它来更新 TextView

要验证 Gradle 是否将原生库打包到应用程序中,请使用 APK 分析器

  1. 选择 **构建 > 构建捆绑包/APK > 构建 APK**。
  2. 选择 **构建 > 分析 APK**。
  3. app/build/outputs/ 目录中选择 APK 或 AAB,然后单击 **确定**。
  4. 如图 2 所示,您可以在 APK 分析器窗口中 lib/<ABI>/ 下看到 libnative-lib.so

    图 2. 使用 APK 分析器查找原生库。

提示: 如果您想尝试使用其他使用原生代码的 Android 应用程序,请单击 **文件 > 新建 > 导入示例**,然后从 **Ndk** 列表中选择一个示例项目。

创建新的 C/C++ 源文件

要将新的 C/C++ 源文件添加到现有项目中,请执行以下操作:

  1. 如果您的应用程序的主要源集中没有 cpp/ 目录,请按照以下步骤创建一个目录:
    1. 打开 IDE 左侧的 **项目** 窗格,并从菜单中选择 **项目** 视图。
    2. 导航到 **your-module > src**。
    3. 右键单击 **main** 目录,然后选择 **新建 > 目录**。
    4. 输入 cpp 作为目录名称,然后单击 **确定**。

  2. 右键单击 cpp/ 目录,然后选择 **新建 > C/C++ 源文件**。
  3. 为您的源文件输入一个名称,例如 native-lib
  4. 从 **类型** 菜单中选择源文件的扩展名,例如 .cpp
    • 单击 **编辑文件类型** 将其他文件类型添加到菜单中,例如 .cxx.hxx。在弹出的 **新建文件扩展名** 对话框中,从 **源扩展名** 和 **头文件扩展名** 菜单中选择另一个文件扩展名,然后单击 **确定**。
  5. 要创建头文件,请选中 **创建关联的头文件** 复选框。
  6. 单击 **确定**。

将新的 C/C++ 文件添加到项目后,您仍然需要 配置 CMake 以将这些文件包含到您的原生库中。

其他资源

要详细了解如何在应用程序中支持 C/C++ 代码,请尝试以下资源。

Codelabs