解析Android Studio 2.2 Native新特性

来源:互联网 发布:网络摄像机多少钱 编辑:程序博客网 时间:2024/06/07 03:49

【进入主题】

好了,正式进入主题。升级后的Android Studio 2.2提供CMakendk-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

 

2C++ 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.txtndk-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脚本的详细参数配置,感兴趣的同学可以自行找资料学习。

原创粉丝点击