26.Android Studio下Ndk开发(ffmpeg导入Android studio以cmake方式编译的过程)
Android studio 2.2開始支持cmake的方式進行jni開發,我在另一篇10.Eclipse下Ndk開發(ffmpeg解碼)中寫過Eclipse下編譯ffmpeg的過程,但是現在幾乎沒有人會使用eclipse作為Android開發工具了,所以很有必要寫一下使用Android studio進行jni開發的一般步驟。
首要確保兩點:第一,你的Android studio 是2.2及以版本,第二,在你的sdk tools中,確保安裝了ndk,cmake,LLDB這三個東西。
其中LLDB是一個高效的c/c++的調試器,目前LLDB也已經取代GDB成為XCode的默認調試器,在Android studio中也可以使用。
CMake 則是一個跨平臺的編譯工具。
ndk配置.png
那么我們如何進行開發呢,Android studio中項目的目錄結構又是怎樣安排,各有什么意義?
android studio下cmake編譯ndk
新建項目時,添加c++支持很簡單,Android studio為我們提供了一個選項(Include C++ support),只需要勾選,系統會為我們默認添加一些配置
那么如果是在舊項目上添加呢,這就需要我們手動配置一下了
Cmake配置文件目錄.png
第一步,創建CMakeLists.txt文件,注意,文件名必須這樣設置,大小寫區分,默認放在項目根目錄下,或者在其他位置,只需要你在build.gradle中配置即可
第二步,在項目根目錄的build.gradle文件中配置
android {......defaultConfig {......// 指定要ndk需要兼容的架構(這樣其他依賴包里mips,x86,armeabi,arm-v8之類的so會被過濾掉)//例如如果的的so只支持arm平臺,那么就像下邊這樣設置,如果還支持其他平臺則再后邊追加ndk{abiFilters 'armeabi'}}......externalNativeBuild{//配置CMakeLists文件地址cmake{path 'CMakeLists.txt'}} }這里貼出來我的CMakeLists.txt配置文件
部分參數解析:
include_directories:表示引入項目so文件所需的頭文件的路徑,在配置文件中配置之后,編寫c代碼的時候可以會在當前路徑下查找頭文件,引入的路徑可以少些一些層級
find_library:引入內部已經支持的庫文件
add_library:引入外部添加的庫文件
cmake_minimum_required(VERSION 3.4.1)#引入頭文件位置 include_directories(src/main/cpp/include/ffmpeg) include_directories(src/main/cpp/include/owner)find_library(android-libandroid )find_library(log-liblog )find_library(jnigraphics-libjnigraphics )#自己的庫 add_library(newffmpegSHAREDsrc/main/cpp/ffmpeg_player.c )# 編解碼(最重要的庫) add_library(avcodecSHAREDIMPORTED )#指定編碼庫的位置 set_target_properties(avcodecPROPERTIES IMPORTED_LOCATION${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavcodec-56.so )#設備信息 add_library(avdeviceSHAREDIMPORTED )#指定設備信息的位置 set_target_properties(avdevicePROPERTIES IMPORTED_LOCATION${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavdevice-56.so )#濾鏡特效處理庫 add_library(avfilterSHAREDIMPORTED )#指定濾鏡庫位置 set_target_properties(avfilterPROPERTIES IMPORTED_LOCATION${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavfilter-5.so )#封裝格式處理庫 add_library(avformatSHAREDIMPORTED )#指定格式庫路徑 set_target_properties(avformatPROPERTIES IMPORTED_LOCATION${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavformat-56.so )#工具庫(大部分庫都需要這個庫的支持) add_library(avutilSHAREDIMPORTED )#指定工具庫路徑 set_target_properties(avutilPROPERTIES IMPORTED_LOCATION${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libavutil-54.so )#后期處理 add_library(postprocSHAREDIMPORTED )#指定后期處理庫路徑 set_target_properties(postprocPROPERTIES IMPORTED_LOCATION${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libpostproc-53.so )#數據格式轉換庫 add_library(swresampleSHAREDIMPORTED )#指定庫位置 set_target_properties(swresamplePROPERTIES IMPORTED_LOCATION${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libswresample-1.so )#視頻像素數據格式轉換 add_library(swscaleSHAREDIMPORTED ) #視頻像素格式轉換庫位置 set_target_properties(swscalePROPERTIES IMPORTED_LOCATION${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libswscale-3.so )# 將預構建庫與本地庫相連 target_link_libraries(newffmpegavcodecavdeviceavfilteravformatavutilpostprocswresampleswscale${android-lib}${jnigraphics-lib}${log-lib} )so和C文件目錄劃分
配置文件搞好了,接下來就要正式的引入編譯好的ffmpeg so文件了,如果不知道如何編譯,可以參考我之前的一片文章 09.阿里云服務器(Ubantu系統)配置ndk 編譯ffmpeghttps://www.jianshu.com/p/826d2175f157,我們在項目main package下創建jniLibs文件夾,將編譯好的so放入這里
jniLibs目錄也是系統默認支持的,你當然可以設置其他名字,或者將目錄放在別的位置,但是要注意,如果你這樣做,一定要在build.gradle中進行指定,否則系統找不到這些文件
細心的你可能發現在上邊的截圖上還有一個cpp的目錄,這個目錄是我們一般用來防止頭文件和c c++文件的,系統默認不會創建這個目錄,也需要我們手動添加,除非你在創建項目的時候就添加了c++ support
這時候,基本上過程已經接近尾聲了,我們來看一下都做了什么:
1.創建CMakeLists.txt腳本文件
2.在build.gradle中配置編譯選項
3.將so庫加入jniLibs文件夾,將.h 和 .c(c++)文件放入cpp目錄
4.還有一步,我們要創建native方法,生成頭文件,加載so,
5.最后一步就是調用了,這一整個過程到此結束
其實這里還有很多細節可以多說一點,比如javah命令如何生成頭文件,javap命令如何獲取方法或者屬性的簽名,最重要的一點,ffmpeg從編寫腳本文件到開始編譯,這一整個過程如何走來,這些基本上在之前的文章中有提到,這里就不再多說了。
總結一下,這里提到的每個過程,CMakeLists.txt文件的編寫才是重中之重,也正是我想說的,把腳本中每一個命令搞清楚,在ndk開發的路上你就更近一步了。
總結
以上是生活随笔為你收集整理的26.Android Studio下Ndk开发(ffmpeg导入Android studio以cmake方式编译的过程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Apache Common Daem
- 下一篇: kubernetes学习笔记 (二):k