Android音視頻探索之旅 | CMake基礎語法 創建支持Ffmpeg的Android項目

一.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;在線查詢個人信息、成績、課表、學業生涯、通知、選課等。系…