Android C++编程之CMakeLists的应用
简介
以前用eclipse编写android项目,一般应用的都是Android.mk文件去编写c代码的配置和生成.so的操作,现在Android studio推出了cMakeLists.txt文件去编写,刚开始应用比较麻烦,如果熟悉了,感觉也简单了。
1.如果应用CMakeLists,新建项目时,就要在android studio去勾选include c++ support
然后一路next
2. 选中C++建立的项目,项目目录会多加几个文件
cpp文件夹就是你的c代码存放的位置
CMakeLists.txt就是你对C环境配置的位置,类似Android.mk
3.build中会多出一些配置
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.example.wzw.myapplication"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
其中在 cmake {
cppFlags ""
}
可以配置cppFlags为 cppFalgs “-std=c++11 -frtti -fexceptions”
这是指定用c++11进行编程,同时还要再CMakeList文件中配置应用c++11
还可以在cmake{}中添加abiFilters ‘armeabi’
这是指定生成哪几种 so库
sourceSets{
main{
jniLibs.srcDirs = ['H:\\SafetyProject\\Serpurity\\app\\alley\\lib']
}
}
添加以上代码,是为了添加你的外部so库路径。
以上就是build的基本配置,当然还有很多其他配置,但是我用这些就够了
4. CMakeList文件
cmake_minimum_required(VERSION 3.4.1)
这是cMake的版本信息
#C++编译
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
这是添加c++11
#配置加载头文件
include_directories(H:/SafetyProject/Serpurity/app/alley/include)
这是配置头文件的路径,在APP文件夹中创建一个alley文件夹,这个文件夹中有一个lib和include文件夹
lib是你引入的第三方so库,include是你引入的.h文件
#动态方式加载
add_library(openssl SHARED IMPORTED )
#引入第三方.so库
set_target_properties(openssl PROPERTIES IMPORTED_LOCATION H:/SafetyProject/Serpurity/app/alley/lib/${ANDROID_ABI}/libcrypto.so)
这是添加你在alley中的so库,有多个则要添加多个so。
add_library( # Sets the name of the library.
signature
SHARED
src/main/cpp/signature.cpp
src/main/cpp/HTTPTools.cpp
)
这只你自己编写的cpp文件,如果在cpp文件夹中有多个.cpp文件,则添加多个(子目录不算) src/main/cpp/HTTPTools.cpp
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
这个默认即可
target_link_libraries( # Specifies the target library.
signature
openssl
android
# included in the NDK.
${log-lib}
z)
这是关联你导入的so库,openssl是你上边导入的so,android是原生jni的不用导入,z也是原生的zlib库,只要在这里添加,不需要在上边导入
5. 子目录中的c代码
我们看到,在cpp文件夹中,有Third文件夹,在这个文件夹中的c文件,并不能在此CMakeList中进型配置,而是要子再子文件夹中新建一个CmakeLists文件
不管有几层子目录,都在有c代码中的子文件目录下添加CMakelists文件,如果多个子文件,则添加多个
cmake_minimum_required(VERSION 3.4.1)
#配置加载头文件
add_library(common
SHARED
dictionary.c )
find_library(log-lib log)
target_link_libraries(common
${log-lib}
)
common中的配置没有什么不同的
cmake_minimum_required(VERSION 3.4.1)
add_library(dec
SHARED
bit_reader.c
decode.c
huffman.c
state.c)
find_library(log-lib log)
target_link_libraries(dec
common
${log-lib}
)
dec中,因为用到了common中的代码,所以在target_link_libraries(dec
common
${log-lib}
)
中要添加common。因为子目录添加cmake文件,就是把子目录代码打包成so库,所以这里添加也类似导入so库
最后,在项目的CMakesLists中添加
ADD_SUBDIRECTORY(src/main/cpp/Third/brotli/common)
ADD_SUBDIRECTORY(src/main/cpp/Third/brotli/dec)
把你子目录的so和项目cmake关联,ok。
其他jni的编写方法,我就不多说了