在您的项目中添加 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. 选择构建 > 构建Bundle(s)/APK(s) > 构建APK(s)
  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