android stduio CMake编译学习
android stduio CMake编译学习
简介
CMake编译配置比之前的Android.mk编译配置简单,功能更强大,话不多说,直接开始
开始
apk的编译都是从build.gradle配置开始的,我们需要在build.gradle里面配置好CMakeLists的位置,以及Cmake的编译配置
def platformVersion = 21
android {
compileSdkVersion 28
defaultConfig {
....
externalNativeBuild {
cmake {
//编译选项 这段可以不进行配置,而使用默认参数
cppFlags "-std=c++11"
//-D变量名=参数1 ,编译Android平台版本以及Cmake的工具链
arguments "-DANDROID_PLATFORM_LEVEL=${platformVersion}",
'-DANDROID_TOOLCHAIN=clang'
}
ndk {
abiFilters "armeabi-v7a"
}
}
}
...
externalNativeBuild {
cmake {
//cmake配置文件位置
path "src/main/cpp/CMakeLists.txt"
}
}
}
想要了解更详细的编译参数选项可以参考这里
进入指定CMakeLists配置
先看个例子,在了解cmake内部的一些语法规则,现在需求是使用第三方的so库,并自己生成一个新库player,对其进行测试:
目录结构图如下:
cpp文件夹下最外层的cmakelist是我们在build里面指定的,因为我们需要使用第三方ffmpeg的so,所以我们需要引入进来,并且指定其位置
# 添加头文件
include_directories(common include)
#引入进来的库
add_library( # 第三方so库名字
ffmpeg
# 标明这个库是一个so库
SHARED
# 从外部引入
IMPORTED)
# 这个ffmpeg库的位置
set_target_properties(ffmpeg #名字
# 属性
PROPERTIES IMPORTED_LOCATION
#位置
${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libffmpeg.so)
#添加播放器源代码,因为这里有一也有一个cmake
add_subdirectory(${CMAKE_SOURCE_DIR}/player)
add_subdirectory(路径)
如果使用这条命令,标明该路径下是一个独立的模块,模块内部有自己的CMakeList,使用自己的编译配置
进入模块配置
因为需要用到ffmpeg库,所以需要使用target_link_libraries动态链接此库,将库链接起来,如下配置:
#添加头文件
include_directories(android)
#添加源文件,会生成一个libplayer.so
add_library(player
SHARED
native-lib.cpp)
#库与库之间的链接共享,android、log等是Android底层自己提供的库
target_link_libraries(player
ffmpeg
-landroid
-llog
-lOpenSLES
-lEGL
${GLES-lib})
以上配置好后,就可以在native-lib.cpp里面调用ffmpeg的方法进行测试了;
cmake其他相关知识可以看看这里