前言
以前使用JNI,都是采用傳統(tǒng)的ndk-bulid的方法贮预,編譯FFmpeg各種找不到.h的錯誤毛仪,我欲哭無淚,后面怎么編譯過的我也表示很懵逼对粪,很多盆友也說在編譯時各種找不到.h的錯誤右冻,哈哈!不過當時查閱各種資料時了解到CMake這種姿勢著拭,而且羽翼君大佬也強烈推薦CMake方式纱扭,后來用了一下感覺真的爽到爆,這次FFmpeg就采用CMake方式移植儡遮。
正文:
-
1 創(chuàng)建包換C++的Android工程項目
如圖勾選include C++ support新建包含C++的工程項目乳蛾,然后一路next下去就好。
不過不出意外的話,你的項目應該會報出如圖錯誤:
因為你的編譯環(huán)境還沒安裝CMake和LLDB屡久,參考另一篇文章Error:A problem occurred configuring project ':app'.
-
2 初識包含C++的Android工程
-
2.1
新建項目大概是以下樣子忆首,MainActivity中會自動生成JNI的鏈接方法,點擊StringFromJNI方法被环,會跳轉(zhuǎn)到native-lib.cpp的文件中的靜態(tài)方法糙及,還有自動生成的CMakeList.txt文本。
-
2.2
native-lib.cpp文件筛欢,從后綴名.cpp可看出這是C++文件(新建項目勾選了include C++ support)浸锨,所以代碼中會有extern "C",
我們來看一下里面的方法: JNIEXPORT jstring JNICALL Java_com_pvirtech_fftest_MainActivity_stringFromJNI,
JNICALL可以理解為調(diào)用Java_Xxx_Xx_x方法版姑,JNIEXPORT是指JNI運算完成后輸出(返回)類型柱搜,仔細觀察不難發(fā)現(xiàn)這個方法的命名規(guī)則是: JNIEXPORT 輸出(返回)類型 JINCALL Java _ 類引用路徑 _ 方法名(把包名中的“.”改為“_”),注意Java的首字母J必須大寫 -
2.3
接著我們來看一下CMakeList.txt的內(nèi)容:
結(jié)合著英文注釋剥险,我所理解的這幾個方法意思是:cmake_minimum_required: 設置CMake的最低版本
add_library(native-lib SHARED src1.c src2.c src/main/cpp/native-lib.cpp ) 把src1.c聪蘸、src2.c、native-lib.cpp 這些資源打包設置成一個名為native-lib的共享庫(SHARED 替換為STATIC則設置為靜態(tài)庫)
find_library( log-lib log ) 從NDK搜尋已有的log庫表制,將他的路徑變量設置為log-lib(后面會用到)
target_link_libraries(native-lib {log-lib}
CMakelist中應該還有set路徑設置么介,include_directories頭文件加載娜遵,add_library庫文件加載勘畔,和CPU架構(gòu)的目標版本加載等配置害晦,這些在下一步我們順其自然的講到,這樣更容易明白浴井。
-
結(jié)語:
本想把移植的內(nèi)容也放到這一編久脯,但那樣可能篇幅就太過長了纳胧,太長的文章我是沒有讀下去更沒有寫下去的興趣了,掩耳盜鈴放到下一篇寫吧帘撰。
下一節(jié)講:
FFmpeg(四):CMake移植FFmpeg的靜態(tài)庫到AndroidStudio中