1. 安装cmake以及ndk

工具栏: Tools-->SDK Manager-->Android SDK

选择SDK Tools,选中NDK 以及 CMake 下载安装

图:

2. 新建工程

修改build.gradle

defaultConfig {minSdk 28targetSdk 32versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"consumerProguardFiles "consumer-rules.pro"externalNativeBuild {cmake {// Passes optional arguments to CMake.arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang"
            // Sets a flag to enable format macro constants for the C compiler.//cFlags "-D__STDC_FORMAT_MACROS"// Sets optional flags for the C++ compiler.cppFlags "-fexceptions", "-frtti"
            //仅生成单个平台 //abiFilters "armeabi-v7a"//,"arm64-v8a" //"x86", "x86_64"
        }}
    //生成多个平台共享库ndk{abiFilters "armeabi-v7a","arm64-v8a" //"x86", "x86_64"}  
    sourceSets {main {jniLibs.srcDirs = ['libs']}}
}
externalNativeBuild {cmake {
        path "src/main/cpp/CMakeLists.txt"version "3.10.2"}
}

3. CMakeLists.txt 修改要点

# 设置本地库编译所需的最小cmake版本
cmake_minimum_required(VERSION 3.10.2)# 本地native项目名
project("ffmpeg")## 配置 ##
# 设置本地库根目录
set(native_root_dir ${CMAKE_CURRENT_LIST_DIR})
# 设置本地库源码路径
set(native_source_dir ${native_root_dir}/native)
# 设置第三方静态库ffmpeg路径
set(native_ffmpeg_dir ${native_root_dir}/ffmpeg/armeabi_v7a)
# 设置第三方库libyuv源码路径
set(native_yuv_dir ${native_root_dir}/libyuv)
# 设置第三方库libyuv编译资源路径
set(native_yuv_build_dir ${native_yuv_dir}/build)
# 设置第三方库libyuv头文件路径
set(native_yuv_inc_dir ${native_yuv_dir}/include)# 设置本地库编译目标名称
set(native_lib_name "ffmpeg")
# 设置本地库编译输出路径
set(native_build_output_dir ${native_root_dir}/../../../build/intermediates/library_jni/debug/jni/${ANDROID_ABI})## 第三方子目录libyuv配置 ##
# 构建编译文件依赖路径
file(MAKE_DIRECTORY ${native_yuv_build_dir})
# 构建添加一个子路径;添加libyuv子目录,执行子目录中的CMakeLists.txt
add_subdirectory( ${native_yuv_dir} ${native_yuv_build_dir} )
# 创建一个static库lib_yuv  直接引用${native_yuv_build_dir}/libyuv_static.a
add_library( lib_yuv STATIC IMPORTED )
set_target_properties( lib_yuv PROPERTIES IMPORTED_LOCATION${native_yuv_build_dir}/libyuv_static.a )# 指定native头文件路径
include_directories(${native_source_dir} )
# 指定libyuv头文件路径
include_directories( ${native_yuv_dir}/include )
# 指定ffmpeg静态库头文件路径
include_directories( ${native_ffmpeg_dir}/include )# 设置native源码文件集合
set(native_source_files${native_source_dir}/native_jni.cpp
)
# 用native_source_files源文件集合编译生成SHARED库
add_library(${native_lib_name} SHARED ${native_source_files} )
# 设置${native_lib_name}库编译输出路径
set_target_properties(${native_lib_name}PROPERTIESLIBRARY_OUTPUT_DIRECTORY"${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}")## import ffmpeg static lib
# 创建一个static库avcodec  直接引用${native_ffmpeg_dir}/lib/libavcodec.a
add_library( avcodec STATIC IMPORTED )
set_target_properties( avcodec PROPERTIES IMPORTED_LOCATION${native_ffmpeg_dir}/lib/libavcodec.a )# 创建一个static库avfilter  直接引用{native_ffmpeg_dir}/lib/libavfilter.a
add_library( avfilter STATIC IMPORTED )
set_target_properties( avfilter PROPERTIES IMPORTED_LOCATION${native_ffmpeg_dir}/lib/libavfilter.a )add_library( avformat STATIC IMPORTED )
set_target_properties( avformat PROPERTIES IMPORTED_LOCATION${native_ffmpeg_dir}/lib/libavformat.a )add_library( avutil STATIC IMPORTED )
set_target_properties( avutil PROPERTIES IMPORTED_LOCATION${native_ffmpeg_dir}/lib/libavutil.a )add_library( swresample STATIC IMPORTED )
set_target_properties( swresample PROPERTIES IMPORTED_LOCATION${native_ffmpeg_dir}/lib/libswresample.a )add_library( swscale STATIC IMPORTED )
set_target_properties( swscale PROPERTIES IMPORTED_LOCATION${native_ffmpeg_dir}/lib/libswscale.a )# 查找动态库log
find_library(log-lib log )
#链接所有动态库/静态库到工程ffmpeg
target_link_libraries(ffmpeg avcodec avfilter avformat avutil swresample swscale lib_yuv ${log-lib})#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
#拷贝库文件.
add_custom_command(TARGET ${native_lib_name} POST_BUILDCOMMAND "${CMAKE_COMMAND}" -Ecopy "${native_build_output_dir}/libffmpeg.so""${native_root_dir}/../../../../app/libs/libffmpeg.so"COMMENT "Copying ${native_lib_name} to output directory")

CMake子目录库关联路径问题:

子目录CMakeLists.txt 匹配:

编译实际结果:

1. so输出路径 CMAKE_LIBRARY_OUTPUT_DIRECTORY 
2. .a 静态库输出路径 CMAKE_ARCHIVE_OUTPUT_DIRECTORY 
2. 获取当前编译的abi , ANDROID_ABI 
3. 编译选项: 
CMAKE_C_FLAGS 
CMAKE_CXX_FLAGS

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wfatal-errors -fPIC")

CMAKE_CXX_FLAGS_DEBUG/CMAKE_CXX_FLAGS_RELEASE 
4. 子目录编译: ADD_SUBDIRECTORY

3.2 关键语句

1). 判断语句

set(BUDEG ON)

if(BUDEG )

//do something

else()

//do something

endif()

2)常用变量

CMAKE_SOURCE_DIR ( 相当于工程根目录 ) 
this is the directory, from which cmake was started, i.e. the top level source directory

CMAKE_CURRENT_SOURCE_DIR 
this is the directory where the currently processed CMakeLists.txt is located in

PROJECT_SOURCE_DIR ( =CMAKE_SOURCE_DIR 相当于工程根目录 ) 
contains the full path to the root of your project source directory, i.e. to the nearest directory where CMakeLists.txt contains the PROJECT() command

CMAKE_PREFIX_PATH (用于找 Findxxx.cmake文件,找 库 和 头文件) 
Path used for searching by FIND_XXX(), with appropriate suffixes added.

CMAKE_INSTALL_PREFIX ( 安装目录 ) 
Install directory used by install. 
If “make install” is invoked or INSTALL is built, this directory is prepended onto all install directories. This variable defaults to /usr/local on UNIX and c:/Program Files on Windows. 
例如: cmake .. -DCMAKE_INSTALL_PREFIX=/my/paht/to/install

3).基本指令

PROJECT(HELLO) 
指定项目名称,生成的VC项目的名称,使用${HELLO_SOURCE_DIR}表示项目根目录。

INCLUDE_DIRECTORIES 
指定头文件的搜索路径,相当于指定gcc的-I参数 
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/Hello) #增加Hello为include目录

TARGET_LINK_LIBRARIES 
添加链接库,相同于指定-l参数 
TARGET_LINK_LIBRARIES(demoHello) #将可执行文件与Hello连接成最终文件demo

LINK_DIRECTORIES 
动态链接库或静态链接库的搜索路径,相当于gcc的-L参数 
LINK_DIRECTORIES(${HELLO_BINARY_DIR}/Hello)#增加Hello为link目录

ADD_DEFINITIONS 
向C/C++编译器添加-D定义,比如: 
ADD_DEFINITIONS(-DENABLE_DEBUG-DABC) 
参数之间用空格分割。如果代码中定义了:

这个代码块就会生效。如果要添加其他的编译器开关,可以通过CMAKE_C_FLAGS变量和CMAKE_CXX_FLAGS变量设置。

ADD_DEPENDENCIES* 
定义target依赖的其它target,确保在编译本target之前,其它的target已经被构建。ADD_DEPENDENCIES(target-name depend-target1 depend-target2 ...)

ADD_EXECUTABLE 
ADD_EXECUTABLE(helloDemo demo.cxx demo_b.cxx) 
指定编译,好像也可以添加.o文件,将cxx编译成可执行文件

ADD_LIBRARY 
ADD_LIBRARY(Hellohello.cxx) #将hello.cxx编译成静态库如libHello.a

ADD_SUBDIRECTORY 
ADD_SUBDIRECTORY(Hello) #包含子目录

Android Studio CMake使用笔记相关推荐

  1. Android Studio 基础入门笔记

    Android Studio 基础入门笔记 Android Studio 基础入门笔记 为什么选择使用 Android Studio 而不是EclipseADT 安卓配置JDK AS如何更新 常规的 ...

  2. Android Studio的代码笔记--基本使用、新建一个项目、修改快捷键、常用控件的使用等

    基本使用 创建一个新项目 新建一个activity 修改主界面 新建一个布局并引用 app模块下的文件目录结构 res 下的常用资源目录 AndroidManifest.xml文件代码解释 Activ ...

  3. NDK开发——Android Studio+CMake实现QQ变声效果

    项目演示 Github:https://github.com/AndroidHensen/NDKVoice 项目分析 项目采用Fmod开源库,一个非常简单通用的音频引擎,对原始声音进行音效的处理即可做 ...

  4. Android Studio Cmake升级至最新版本

    1.存在的问题 Android Studio SDK manager管理器中截止目前最新的Cmake版本为3.18.1,如下图 编译时出现警告: C/C++: debug|arm64-v8a :Cal ...

  5. android studio cmake 2.2使用案例

    使用Android Studio 2.2和Cmake (CMakeLists)让OpenCV 飞起来 标签: androidopencvcmake 2016-11-22 13:23 1505人阅读 评 ...

  6. Android Studio Cmake C++ JNI demo

    说明:本人实验android studio版本是3.2以上的 1.新建一个工程,要勾选"Inlcude C++ support",然后一路next, 创建完成后就有一个jni c+ ...

  7. Android Studio学习开发笔记--基础

    关于进阶项目篇,点击这里 文章目录 前言 构建首个应用 运行 第一次可能会出现的问题 想要重新下载安装Android Studio 文件在哪里编辑 android基础--控件 基础属性 带阴影的Tex ...

  8. Android Studio Notes/学习笔记

    学习视频来源:https://www.bilibili.com/video/BV1jW411375J?from=search&seid=16068849106535436916 文章目录 小知 ...

  9. Android Studio官方视频教程笔记

    01. 简介 02. 视频教程准备 补充相应的Java编程课程 Java Essential Training Java Advanced Training 补充相应的Android开发课程 Andr ...

最新文章

  1. 测试Python下载图片的三种方法
  2. BZOJ1861:[ZJOI2006]书架(Splay)
  3. EGLImage与纹理
  4. html页面表格导出到excel总结
  5. Android如何在java代码中设置margin
  6. HDU Problem - 1455 Sticks
  7. 定时任务 - 定时任务弊端与优化方案
  8. Java、JavaScript、C、C++、PHP、Python都是用来开发什么?赶紧来看看!
  9. 从AI打王者荣耀到自动驾驶,高通一口气公布了5G+AI未来的无数种可能
  10. Problem 71:Ordered fractions
  11. Eclipse反编译插件
  12. boss直聘一句话介绍优势_第一批被安永淘汰的00后实习生,就因为自我介绍说了这一句话!...
  13. C#报错Newtonsoft.Json.JsonSerializationException: “A member with the name ‘phone‘ already
  14. 基于STM32的MLX90614(GY-906)人体红外测温
  15. info是Linux的帮助工具,Linux下的帮助命令(man/help/info)
  16. 基于Maven 分模块开发实践
  17. 你的必备技能 —— 方法
  18. 用JAVA写个飞机小游戏玩玩吧
  19. [转] 心态是最大的本钱;人无完人,重要的是怎么做人
  20. Laravel + EasyWeChat 微信登陆功能

热门文章

  1. 计算机用户名密码设置密码,电脑密码怎么设置 教你电脑开机密码 屏保密码如何设置【图文】-太平洋电脑网PConline_教你学电脑_太平洋电脑网PConline...
  2. 开机电脑的密码怎么设置才有效保护电脑的隐私
  3. 凡事,预则立,不预则废
  4. Python项目:飞机大战
  5. 几张图就能轻松掌握Git常用命令和原理
  6. 【C++】医学影像PACS管理系统源码支持三维图像后处理和重建
  7. uniapp小程序使用symbol格式图标(阿里图标库)
  8. Redisson锁解锁时WRONGTYPE Operation against a key holding the wrong kind of value
  9. Graph Pooling 简析
  10. Gem pooling、max pooling、average pooling