[TOC]

文章参考:https://developer.android.com/studio/projects/add-native-code?hl=zh-cn

文章参考:https://juejin.im/post/5db28ad4f265da4cf022c866

文章参考:《NDK开发指南》https://developer.android.com/training/articles/perf-jni?hl=zh-cn

概述

您可以向 Android 项目添加 C 和 C++ 代码,只需将相应的代码添加到项目模块的 cpp 目录中即可。在您构建项目时,这些代码会编译到一个可由 Gradle 与您的 APK 打包在一起的原生库中。然后,Java 或 Kotlin 代码即可通过 Java 原生接口 (JNI) 调用原生库中的函数。如需详细了解如何使用 JNI 框架,请参阅 Android JNI 提示。

Android Studio 支持适用于跨平台项目的 CMake,以及速度比 CMake 更快但仅支持 Android 的 ndk-build。目前不支持在同一模块中同时使用 CMake 和 ndk-build。

如果您想要将现有的 ndk-build 库导入到 Android Studio 项目,请了解如何将 Gradle 关联到原生库项目。

准备工作

下载 NDK 和构建工具

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

  • Android 原生开发套件 (NDK):一个工具集,让您能够在 Android 项目中使用 C 和 C++ 代码;它提供了各种平台库,让您能够管理原生 Activity 并访问实体设备组件,例如传感器和轻触输入。

  • CMake:一款外部构建工具,可与 Gradle 搭配使用来构建原生库。如果您只计划使用 ndk-build,则不需要此组件

  • LLDB:Android Studio 用于调试原生代码的调试程序。

    如需了解如何安装这些组件,请参阅安装和配置 NDK、CMake 和 LLDB

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

创建支持原生代码的新项目的步骤与创建任何其他 Android Studio 项目的步骤相似,但前者还需要执行一个额外的步骤:

  1. 在向导的 Choose your project 部分中,选择 Native C++ 项目类型。

  2. 点击 Next

  3. 填写向导下一部分中的所有其他字段。

  4. 点击 Next

  5. 在向导的 Customize C++ Support 部分中,您可以使用 C++ Standard 字段自定义项目。使用下拉列表选择您想要使用哪种 C++ 标准化。选择 Toolchain Default 可使用默认的 CMake 设置。

  6. 点击 Finish

在 Android Studio 完成新项目的创建后,请从 IDE 左侧打开 Project 窗格,然后选择 Android 视图。如图 2 所示,Android Studio 会添加 cpp 组:

安装及配置 NDK 和 CMake

image-20220622090128756

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

  • Android 原生开发套件 (NDK):一套工具,可让您在 Android 应用中使用 C 和 C++ 代码。
  • CMake:一款外部构建工具,可与 Gradle 搭配使用来构建原生库。如果您只计划使用 ndk-build,则不需要此组件。
  • LLDB:Android Studio 用于调试原生代码的调试程序。默认情况下,安装 Android Studio 时会随同安装 LLDB。

配置特定版本的 CMake

SDK 管理器包含 CMake 的 3.6.0 分支版本和 3.10.2 版本。未设置特定 CMake 版本的项目使用 CMake 3.10.2 进行构建。如需设置 CMake 版本,请将以下内容添加到模块的 build.gradle 文件中:

1
2
3
4
5
6
7
8
9
android {
...
externalNativeBuild {
cmake {
...
version "cmake-version"
}
}
}
    在 **cpp** 组中,您可以找到项目中的所有原生源代码文件、头文件、CMake 或 ndk-build 的构建脚本,以及项目中的预构建库。对于新项目,Android Studio 会创建一个示例 C++ 源代码文件 `native-lib.cpp`,并将其置于应用模块的 `src/main/cpp/` 目录中。此示例代码提供了一个简单的 C++ 函数 `stringFromJNI()`,它会返回字符串“Hello from C++”。如需了解如何向项目中添加其他源代码文件,请参阅介绍如何[创建新的原生源代码文件](https://developer.android.com/studio/projects/add-native-code?hl=zh-cn#create-sources)的部分。

我们看一下,我们build.gradle里面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 // 导入CMake构建。声明C++的版本号
defaultConfig {
externalNativeBuild {
cmake {
cppFlags "-std=c++17"
}
}
}

// 其实这个地方就是告知Gradle的进行Cmake编译的路径和版本号
// 具体怎么编译是CMakeList的事情
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt" //构建脚本的路径
version "3.10.2" //CMake的版本
}
}
执行完成之后,我们可以看一下编译产物:
image-20210130123741233
    我们看到在build目录下的中间产物的目录下面的cmake/debug/目录下就有我们的中间产物

    与 `build.gradle` 文件指示 Gradle 如何构建应用一样,CMake 和 ndk-build 需要构建脚本以确定如何构建您的原生库。对于新项目,Android Studio 会创建 CMake 构建脚本 `CMakeLists.txt`,并将其置于模块的根目录中。如需详细了解此构建脚本的内容,请参阅[配置 CMake](https://developer.android.com/studio/projects/configure-cmake?hl=zh-cn)。

关于如何配置CMake: https://developer.android.com/studio/projects/configure-cmake?hl=zh-cn

现有Android工程添加C/C++ 代码

向现有 Android Studio 项目添加或导入原生代码,则需要按以下基本流程操作:

这部分其实很简单,就把我我们从新工程里面生成的那些文件放在现有工程的对应未知。就可以了.

主要有下面几个工程修改:

  1. build.gradle里面面的CMake配置
  2. src/main/cpp的目录下的文件拷贝到新的工程

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

如需将新的 C/C++ 源代码文件添加到现有项目,请按以下步骤操作:

使用CMake创建HelloWorld的工程

https://developer.android.com/codelabs/android-studio-cmake?hl=zh-cn#0