Android Studio使用CMake构建脚本调用jni

在Android Studio 2.2以后开始支持CMake来配置jni信息,这样的话我们可以直接使用CMake来配置jni信息,不需要在使用android.mk文件

首先下载 NDK 和构建工具(如已安装直接跳过,)


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

  • NDK:这套工具集允许您为 Android 使用 C 和 C++ 代码,并提供众多平台库,让您可以管理原生 Activity 和访问物理设备组件,例如传感器和触摸输入。
  • CMake:一款外部构建工具,可与 Gradle 搭配使用来构建原生库。
  • LLDB:一种调试程序,Android Studio 使用它来调试原生代码。

使用SDK Manager安装这些组件:

  1. 在打开的项目中,从菜单栏选择 Tools > Android > SDK Manager
  2. 点击 SDK Tools 标签。
  3. 选中 LLDBCMake 和 NDK 旁的复选框,如下图所示Android Studio使用CMake构建脚本调用jni
  4. 点击apply,等待下载完成点击finish即可。

接下来开始编译jni代码

创建一个项目(如果你只想编译项目中已有的jni代码,不需要重新创建项目的话,后面会介绍),步骤和普通创建项目的大致一样,只是在创建项目的时候,勾选上includ C++ Support,如下图所示

Android Studio使用CMake构建脚本调用jni

勾选了勾选上includ C++ Support你会发现比平常创建项目会多一个界面,就是最后一个界面,如下图所示

Android Studio使用CMake构建脚本调用jni

  • Standard:使用下拉列表选择您希望使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的 CMake 设置。
  • Exceptions Support:如果您希望启用对 C++ 异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio 会将 -fexceptions 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。
  • Runtime Type Information Support:如果您希望支持 RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将 -frtti 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。

点击Finish创建完成后,你会发现多了一个cpp目录和External Build Files模块,并且External Build Files模块下有个CMaskeLists.txt配置文件,如下图所示

Android Studio使用CMake构建脚本调用jni

cpp目录里面里面专门放c++或者c源文件,项目刚创建好这里面有一个示例c++文件
External Build Files 专门放项目中所有Module的CMake配置文件,名字是固定写法"CMakeLists.txt",需要注意的是
add_library()方法里面传入的so名称最后会自动变成 lib你传的名称.so,但是你在加载so库的时候,还是传你写的名称,这
是CMake的规范

接下来直接点击运行就可以了。如果你想看so库是否编译到你的apk里面,可以使用APK分析器

  1. 选择 Build > Analyze APK
  2. 从 app/build/outputs/apk/ 目录中选择 APK 并点击 OK
  3. 如图 3 中所示,您会在 APK 分析器窗口的 lib/<ABI>/ 下看到 lib你的so库名称.so

让现有项目使用CMake

1.创建源文件c或c++(如果项目中有,跳过此步骤)

从 Android Studio 的左侧打开 Project 窗格并从下拉菜单中选择 Project 视图,打开你想编写代码的Module,选中mian目录右击创建一个cpp目录,在里面编写你的c或者c++代码
2.创建CMake构建脚本
从 Android Studio 的左侧打开 Project 窗格并从下拉菜单中选择 Project 视图,选中你Module,右键新建文件 输入“CMakeLists.txt”点击ok,配置一下内容
cmake_minimum_required(VERSION 3.4.1)

add_library( # Specifies the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.cpp )
主要是 cmake_minimum_required(VERSION 3.4.1) 和 add_library(libname SHARED 源文件path)这两个方法。


使用 add_library() 向您的 CMake 构建脚本添加源文件或库时,Android Studio 还会在您同步项目后在 Project 视图下显示关联的标头文件。不过,为了确保 CMake 可以在编译时定位您的标头文件,您需要将 include_directories() 命令添加到 CMake 构建脚本中并指定标头的路径:
# Specifies a path to native header files.
include_directories(src/main/cpp/include/)
CMake文件编写完成,你需要关联你的gradle,直接在你module中添加
android {
  ...
  defaultConfig {...}
  buildTypes {...}

  // Encapsulates your external native build configurations.
  externalNativeBuild {

    // Encapsulates your CMake build configurations.
    cmake {

      // Provides a relative path to your CMake build script.
      path "CMakeLists.txt"
    }
  }
}

然后直接运行你的项目就可以了。
更多API信息可以查看android官方文档:https://developer.android.google.cn/ndk/guides/cmake.html#variables  (无需*)

有什么问题可以在下方讨论