一.CMake语法

  • CMake语法非常多,我们知道如何导入静态库和动态库以及最基础的使用,目前是够用的。其它方面则根据实际项目同步学习。

1.1.基础语法-常用

  • cmake_minimum_required:指定cmake最小版本
  • include_directories:引入(原生代码或库的)头文件
  • add_library:主要作用:将指定的源文件生成链接文件,然后添加到工程中去
  • find_library:引入NDK中的标准库
  • target_link_libraries:将预构建库关联到原生库
  • aux_source_directory:查找在某个路径下的所有源文件

1.2.原生库导入

  • 有两种方案
    • 1.直接在target_link_libraries添加;
    • 2.先使用find_library,然后结合target_link_libraries;

1.3.从原生代码构建一个原生库

  • 使用add_library和target_link_libraries配合使用;
    • 如:假设调用System.loadLibrary(“practiceffmpegplayer”),则在CMakeLists.txt中使用add_library(practiceffmpegplayer SHARED native-lib.cpp),然后使用target_link_libraries(practiceffmpegplayer);
    • System.loadLibrary定义的库名称必须要和add_library中的第一个参数名称一样;

1.4.动态库或静态库导入

  • 分3步
    • 1.指定静态库或动态库的头文件路径,调用include_directories(路径);
    • 2.设置环境变量(写法几乎固定,跟也要结合实际情况来调整):
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}")
    
    • 3.在target_link_libraries中添加静态库或动态库的名字
    • 注意:别忘记配置build.gradle,如下图:
      在这里插入图片描述

1.5.aux_source_directory方法的使用

  • 语法
aux_source_directory(<dir> <variable>)
<dir>:要扫描的目录(实践过相对路径,不会递归包含子目录,仅包含指定的dir目录)。
<variable>:存储找到的源文件列表的变量名。
  • 如:收集 src/ 目录下的所有源文件
aux_source_directory(src SOURCE_FILES)
//继续调用add_library方法
add_library(native-lib SHARED ${SOURCE_FILES})

二.创建支持Ffmpeg的Android项目

  • 创建native项目,在native-cpp文件中掉用ffmpeg提供的一个方法,打印ffmpeg编译配置信息。第一节中除了静态库和aux_source_directory未在项目中使用到,其它的都进行了使用,并做了详细的注释。gradle的修改在1.3中有详细的截图信息,重点关注CMakeLists.txt文件。

  • 运行效果
    在这里插入图片描述

  • CMakeLists.txt文件

#设置此项目所需的最低CMake版本。
cmake_minimum_required(VERSION 3.22.1)#include_directories:指定 原生代码 或 so库 的头文件路径
#添加头文件路径(相对于本文件路径)
include_directories(include)#声明项目名称。
project("ffmpeg_simple01")#find_library:将一个变量和Android NDK的某个库建立关联关系。该函数的第二个参数为Android NDK中对应的库名称,
#而调用该方法之后,它就被和第一个参数所指定的变量关联在一起。 在这种关联建立以后,我们就可以使用这个变量在构建脚本的其它部分引用该变量所关联的NDK库。
find_library(log-liblog)#CMAKE_SOURCE_DIR 表示的是CMakeLists.txt所在的路径
#message("============================= 1 =============================")
#message("${CMAKE_CXX_FLAGS}")
#message("============================= 2 =============================")
#message("${CMAKE_SOURCE_DIR}")
#message("============================= 3 =============================")
#message("${ANDROID_ABI}")
#message("${CMAKE_HOME_DIRECTORY}/libs/${ANDROID_ABI}")
#设置环境变量         结合include_directories(include),最后在target_link_libraries中添加静态库或动态库的名字,就可以实现引入第三方静态库或动态库
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}")#add_library:添加 源文件或库
#创建可执行文件或库的目标
#第一个参数,决定了最终生成的共享库的名字
#第二个参数,我们可以指定根据源文件编译出来的是静态库还是共享库,分别对应STATIC/SHARED关键字
#第三个参数,指定源文件   (为IMPORTED时则表示是外部预编译的)#创建并命名一个库(构建一个原生库)
#在 Android 中调用 System.loadLibrary("ffmpeg_simple01") 时,库名称 必须 与 CMakeLists.txt 中定义的目标库名称 完全匹配。即add_library中的第一个参数不能随便定义
#在这个顶级CMakeLists.txt中,${CMAKE_PROJECT_NAME}用于定义目标库名称;
add_library(${CMAKE_PROJECT_NAME} SHARED native-lib.cpp)#将预构建库关联到原生库
#指定CMake应链接到目标库的库。可以链接来自不同来源的库,例如本文中定义的库构建脚本、预构建的第三方库或Android系统库。
target_link_libraries(${CMAKE_PROJECT_NAME}avcodecavformatavutilswresampleswscaleandroid${log-lib})
  • 代码相关
    在这里插入图片描述

三.总结

  • 本篇文章记录了最常用的CMake语法,以及在Android项目的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88035.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88035.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/88035.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React Native 初始化项目和模拟器运行

中文官方文档&#xff1a;https://reactnative.cn/docs/environment-setup 英文官方文档&#xff1a;https://reactnative.dev/docs/getting-started-without-a-framework#step-1-creating-a-new-application 创建新项目 1、初始化 # 如果你之前全局安装过旧的react-native-cli…

20250706-5-Docker 快速入门(上)-创建容器常用选项_笔记

一、创建容器常用选项&#xfeff;&#xfeff;1. 创建容器常用选项&#xfeff;1&#xff09;常用选项创建容器常用选项&#xfeff;交互式选项&#xff1a;-i&#xff1a;保持标准输入打开&#xff0c;允许交互式操作-t&#xff1a;分配伪终端&#xff0c;使容器像传统终端一…

插值与拟合(3):B样条曲线

在路径规划问题中&#xff0c;通常会用到B样条来平滑路径&#xff0c;本文实现并封装了三次准均匀开放B样条曲线&#xff0c;供大学学习使用。作者提供了三套代码方案。可以用于不同平台&#xff1a;方案1&#xff1a;MATLAB&#xff1b;方案2&#xff1a;标准C&#xff1b;方案…

[免费]基于Python豆瓣电影数据分析及可视化系统(Flask+echarts+pandas)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的于Python豆瓣电影数据分析及可视化系统(Flaskechartpandas)【论文源码SQL脚本】&#xff0c;分享下哈。项目介绍随着如今电影越来越多&#xff0c;各种各样的烂片和捞钱的商业片也层出不穷&#xff0c;而有意…

SQL127 月总刷题数和日均刷题数

SQL127 月总刷题数和日均刷题数 withtemp as (selectDATE_FORMAT(submit_time, "%Y%m") as submit_month,count(question_id) as month_q_cnt,round(count(question_id) / day(last_day(max(submit_time))),3) as avg_day_q_cntfrompractice_recordwhereyear(submit…

unity luban接入

1.找到luban官网并下载他的例子和.net8.0的sdk安装 官网地址如下 快速上手 | Luban 参考大佬教程如下 Luban新版本接入教程_哔哩哔哩_bilibili 2.找到他的luban_examples-main示例下的两个文件MiniTemplate和tool 3.MiniTemplate这个文件复制一份到项目工程下&#xff0c;自…

Django服务开发镜像构建

最后完整的项目目录结构1、安装依赖pip install django django-tables2 django-filter2、创建项目和主应用django-admin startproject configcd configpython manage.py startapp dynamic_models3、配置settings.py将项目模块dynamic_models加入进来&#xff0c;django_tables2…

20250706-3-Docker 快速入门(上)-常用镜像管理命令_笔记

一、配置加速器&#xfeff;1. Docker Hub简介与地址&#xfeff;公共镜像仓库: 由Docker公司维护的公共镜像仓库&#xff0c;包含大量容器镜像默认下载源: Docker工具默认从这个公共镜像库下载镜像访问地址: https://hub.docker.com镜像搜索功能: 可通过浏览器访问图形化管理系…

【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能

注意&#xff1a;考虑到优化的内容比较多&#xff0c;我将该内容分开&#xff0c;并全部整合放在【unity游戏开发——优化篇】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言实战1、确保所有静止的3D物体都标记为Occluder Static静态遮挡体和Occludee …

通用业务编号生成工具类(MyBatis-Plus + Spring Boot)详解 + 3种调用方式

在企业应用开发中&#xff0c;我们经常需要生成类似 BZ -240704-0001 这种“业务编号”&#xff0c;它通常具有以下特点&#xff1a;前缀&#xff1a;代表业务类型&#xff0c;如 BZ 表示包装日期&#xff1a;年月日格式&#xff0c;通常为 yyMMdd序列号&#xff1a;当天内递增…

前端相关性能优化笔记

1.打开速度怎么变快 - 首屏加载优化2.再次打开速度怎么变快 - 缓存优化了3.操作怎么才顺滑 - 渲染优化4.动画怎么保证流畅 - 长任务拆分2.1 首屏加载指标细化:1.FP(First Paint 首次绘制) 2.FCP(First contentful Paint 首次内容绘制)&#xff0c;FP 到 FCP 中间其实主要是 SPA…

7.7晚自习作业

实操作业02&#xff1a;Spark核心开发 作业说明 请严格按照步骤操作&#xff0c;并将最终结果文件&#xff08;命名为&#xff1a;sparkcore_result.txt&#xff09;于20点前上传。结果文件需包含每一步的关键命令执行结果文本输出。 一、数据读取与转换操作 上传账户数据$…

手机FunASR识别SIM卡通话占用内存和运行性能分析

手机FunASR识别SIM卡通话占用内存和运行性能分析 --本地AI电话机器人 上一篇&#xff1a;手机无网离线使用FunASR识别SIM卡语音通话内容 下一篇&#xff1a;手机通话语音离线ASR识别商用和优化方向 一、前言 书接上一文《阿里FunASR本地断网离线识别模型简析》&#xff0c;…

虚幻引擎Unreal Engine5恐怖游戏设计制作教程,从入门到精通从零开始完整项目开发实战详细讲解中英字幕

和大家分享一个以前收集的UE5虚幻引擎恐怖游戏开发教程&#xff0c;这是国外一个大神制作的视频教程&#xff0c;教程从零开始到制作出一款完整的游戏。内容讲解全面&#xff0c;如蓝图基础知识讲解、角色控制、高级交互系统、高级库存系统、物品检查、恐怖环境氛围设计、过场动…

多人协同开发时Git使用命令

拉取仓库代码 # 拉取远程仓库至本地tar_dir路径 git clone gitgithub.com:your-repo.git target_dir # 默认是拉取远程master分支&#xff0c;下面拉取并切换到自己需要开发的分支上 # 假设自己需要开发的分支是/feature/my_branch分支 git checkout -b feature/my_branch orig…

线性表——双向链表

线性表——双向链表1. 双向链表的实现1.1 简单图例1.2 结点的定义1.3 新结点的创建1.4 链表的初始化1.5 结点的插入1.5.1 头部插入&#xff08;头插&#xff09;1.5.2 尾部插入&#xff08;尾插&#xff09;1.5.3 任意位置&#xff08;前&#xff09;插入1.6 结点的删除1.6.1 头…

Java后端技术博客汇总文档

文章目录 前言Java后端汇总链接Java基础知识点数据结构算法&#xff08;Java实现&#xff09;算法知识点合集算法刷题算法竞赛AcWing课程蓝桥杯AB组辅导课合集&#xff08;更新中…&#xff09; 源码分析redission 数据库SQL ServerMySQLRedis -Canal JUC并发编程JVMNetty日志框…

QT 菜单栏设计使用方法

目录 常用设置函数 多个QAction的单选设置 ​​​​​​​菜单相关类 ​​​​​​​ 系统菜单的生成和响应 使用代码添加系统菜单 使用UI设计器设计系统菜单 使用Qt设计及界面时&#xff0c;常用的两种方式添加菜单&#xff0c;第一使用UI界面添加&#xff0c;第二种 在…

AIGC领域AI艺术,打造个性化艺术作品

AIGC领域AI艺术,打造个性化艺术作品 关键词:AIGC、AI艺术、生成对抗网络、个性化创作、深度学习、艺术风格迁移、创意计算 摘要:本文深入探讨了AIGC(人工智能生成内容)在艺术创作领域的应用,重点分析了如何利用AI技术打造个性化艺术作品。文章从技术原理出发,详细解析了生…

基于Flask+Jinja2的快捷教务系统(后端链接到新版正方教务系统)

快捷教务系统&#xff08;Easy Educational Administration Management System, EasyEAMS&#xff09; 项目简介 EasyEAMS 是一个基于 Flask Jinja2 的现代化教务系统 Web 应用。学生可通过网页端登录&#xff0c;在线查询个人信息、成绩、课表、学业生涯、通知、选课等。系…