除此之外,咱们还应该学习CMake的哪些重要知识?
1、CMake工具编译生成的库文件默认在什么位置?apk中库文件又是在什么位置? 2、CMake工具如何指定编译生成的库文件位置? 3、CMake工具如何指定生成不同CPU平台对应的库文件?带着这些问题,咱们开始CMake之旅吧:
3.2.1、NDK环境检查编译前,建议先检查下工程的NDK配置情况(不然容易报一些乱七八糟的错误):
File --> Project Structure --> SDK Location,如下图(我本地的Android Studio默认没有给配置NDK路径,那么,需要自己手动指定一下):
因为本节主讲CMake编译工具,代码就不单独写了,咱们直接使用工程默认生成的native-liv.cpp,简单调整一下native实现方法的代码吧(修改返回文本信息):
因Native C++工程默认已配置好了CMakeLists.txt和gradle,所以咱们可直接运行工程看效果,如下图:
JNI交互效果我们已经看到了,说明CMake编译成功了。那么,这究竟是怎么做到的呢?咱们接着分析一下吧:
3.2.3、CMake生成的库文件与apk中的库文件安卓工程编译时,会执行CMake编译,在 工程/app/build/.../cmake/ 中会产生对应的so文件,如下图:
继续编译安卓工程,会根据build中的内容,生成我们的*.apk安装包文件。我们找到、反编译apk安装包文件,查找so库文件。原来在apk安装包中,so库都被存放在lib目录中,如下图:
3.2.4、CMake是如何编译生成so库的呢?在前面介绍CMake定义时,提到了CMake是基于CMakeLists.txt文件和gradle配置实现编译Native类的。那么,咱们先来看一下CMakeLists.txt文件吧:
#cmake最低版本要求 cmake_minimum_required(VERSION 3.4.1) #添加库 add_library( # 库名 native-lib # 类型: # SHARED 是指动态库,对应的是.so文件 # STATIC 是指静态库,对应的是.a文件 # 其他类型:略 SHARED # native类路径 native-lib.cpp) # 查找依赖库 find_library( # 依赖库别名 log-lib # 希望加到本地的NDK库名称,log指NDK的日志库 log) # 链接库,建立关系( 此处就是指把log-lib 链接给 native-lib使用 ) target_link_libraries( # 目标库名称(native-lib 是咱们要生成的so库) native-lib # 要链接的库(log-lib 是上面查找的log库) ${log-lib})实际上,CMakeList.txt可配置的内容远不止这些,如:so输出目录,生成规则等等,有需要的同学可查下官网。
接着,咱们再看一下app的gradle又是如何配置CMake的呢?
apply plugin: 'com.android.application' android { compileSdkVersion 29 buildToolsVersion "29.0.1" defaultConfig { applicationId "com.qxc.testnativec" minSdkVersion 21 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" //定义cmake默认配置属性 externalNativeBuild { cmake { cppFlags "" } } } //定义cmake对应的CMakeList.txt路径(重要) externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' }实际上,gradle可配置的cmake内容也远不止这些,如:abi、cppFlags、arguments等,有需要的同学可查下官网。
3.2.5、如何指定库文件的输出目录?