解析Android Studio 2.2 Native新特性
【进入主题】
好了,正式进入主题。升级后的Android Studio 2.2提供了对CMake、ndk-build两种构建方式的支持,大大方便了Native开发。原来的 Experimental Gradle Plugin构建方式仍然可用,但是官方建议迁移。IDE构建生成的 .so文件将直接被Gradle打包在 apk中,同时提供对 Native代码编辑的支持(各种代码提示)。
【准备工作】
创建一个支持Native开发的新项目,需要准备以下几个工具:
The Android Native Development Kit (NDK) —— 强大的Native开发工具集,你懂的!
CMake —— 外部构建工具,和Gradle配合使用构建native库(功能类似ndk-build)
LLDB —— 支持Android Studio调试native层代码
这三个工具可以通过SDK Manager下载,如下两张截图所示:
【创建 C/C++ 新项目】
和创建普通项目流程类似,区别在于如下截图所示:
1、勾选Include C++ Support
2、C++ Standard—— 默认选择Toolchain Default
Exceptions Support —— 勾选表示支持C++异常处理(对应build.gradle的设置参赛-fexceptions)
Runtime Type Information Support —— 勾选表示支持RTTI(对应build.gradle的设置参赛-frtti)
【成功创建后的目录结构】
说明:
1、cpp目录存放c/c++源码、文件头(.h)和预编译库文件
2、External Build Files 目录存放构建脚本文件(CMakeLists.txt或ndk-build)
【创建新的native源文件】
1、右击cpp->New->C/C++ Source File
2、如果希望生成对应的头文件,可以勾选红色框内选项
【构建并运行】
点击Build->Build Apk
说明:构建过程中,Gadle会读取构建脚本CMakeLists.txt,通过执行脚本里的指令来编译native-lib.cpp,生成libnative-lib.so并且被自动打包到APK里面。
注:
1、Instant Run功能不兼容使用了native code的项目
2、验证so包的生成
点击Build ->Analyze Apk,选择 app/build/outputs/apk/app-debug.apk
从图中可看出,默认情况下CMake编译出了各个平台对应的so包。如果需要生成指定ABIs,可在module-level下的build.gradle修改如下:
android {
defaultConfig {
...
ndk {
// Specifies the ABI 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
abiFilters 'armeabi'
}
} }
重新Build后,再次Analyze Apk如下图所示:
【CMakeLists.txt脚本解析】
1、cmake_minimum_required(VERSION 3.4.1)
指定CMake 使用的最低版本。注,不能低于3.4.0
2、add_library(native-lib SHARED src/main/cpp/native-lib.cpp )
创建指定名称和模式的库。
native-lib —— 生成库的名次,可以自定义
SHARED ——生成共享库(如果指定成STATIC是静态库)
Src/.../native-lib.cpp —— 库对应的C++源码所在位置
3、find_library(log-lib log)
指定编译过程中,需要使用到的预编译库路径和名称。默认情况下,预编译的系统库包含在搜索路径下,只需指定要使用的NDK库名称即可。CMake会在编译完成前校验使用的系统库是否存在。
log-lib —— path变量的名称,可自定义
log —— CMake要加载的NDK库名称(liblog.so)
4、target_link_libraries(native-lib ${log-lib})
指定CMake要链接到目标库内的库。可以指定多个库,例如用户通过构建脚本生成的库、第三方预编译库、系统库等
native-lib —— 即将生成的目标库名称
${log-lib} —— 要被链接到目标库内的库(和 find_library中的path变量名对应)
【最后】
这篇博客只是对新建项目支持c/c++开发的初步介绍。关于CMakeLists.txt脚本的详细参数配置,感兴趣的同学可以自行找资料学习。