本文以使用lame庫為例克懊,這是一個音頻編碼為mp3的開源庫墓懂,首先下載需要的版本焰宣,這里是下載地址:目前最新是lame_3.100。
由于lame的源碼比較少捕仔,可以采用直接引用源碼的方式匕积,無需編譯成so庫再使用盈罐,所以本文介紹的也是引用源碼的方式使用c/c++開源庫,至于像ffmpeg這類的有大量源碼的開源庫就只能先變成出so庫再使用闪唆,這種方式會在下一篇文章中介紹盅粪。
很多時候在項目中一開始可能并不會有ndk開發(fā)的需求,所以一開始創(chuàng)建的項目并不支持ndk悄蕾,所以本文會以普通module來一步一步引入使用票顾,接下來進入正文。
支持ndk
其實很簡單就是三步:
在main目錄下創(chuàng)建cpp目錄帆调,并選擇Mark Directory as Sources Root奠骄。
創(chuàng)建CMakeLists.txt文件
-
并在該module的build.gradle文件的android節(jié)點下添加
externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" version "3.10.2" } }
配置完成,這個module就是支持ndk的了番刊。
引入lame
本文是以引用源碼的方式接入的含鳞,所以來到lame的下載目錄,找到libmp3lame目錄芹务,并把該文件夾直接拷貝到項目的cpp目錄下民晒,為了方便改名為lame。
雖然代碼量不大锄禽,但是一個一個的引入還是太麻煩了潜必,可以通過一句話全部引入并定義為lame。
file(GLOB lame lame/*.c)
然后lame目錄下的所有引入頭文件
include_directories(lame)
接著再定一個類來操作lame沃但,且和java層對接磁滚,就叫l(wèi)ame_util.cpp吧,最后還需要定義一下該庫的名字宵晚,就叫l(wèi)ame_util吧垂攘,如下。
add_library(
lame_util
SHARED
${lame}
lame_util.cpp)
這樣基本的引入就完成了淤刃,但是編譯還是有點問題的晒他,首先這是一個c寫的庫,編譯的時候我們需要設(shè)置一個flag逸贾,不然內(nèi)部有的引用找不到陨仅,在build.gradle文件的android/defaultConfig節(jié)點下加入這句話:
externalNativeBuild {
cmake {
cFlags "-DSTDC_HEADERS"
}
}
再編譯發(fā)現(xiàn)還是有錯誤提示,不出意外應(yīng)該是找不到ieee754_float32_t這個類型铝侵,這是因為Android內(nèi)的庫沒有這個定義灼伤,其實就是float類型,我們手動改成float就可以了咪鲜。
這樣再編譯就沒有問題了狐赡。
接著我們這個是lame_util.cpp文件,這是c++的文件疟丙,引入c的代碼需要使用extern關(guān)鍵字颖侄,所以引用的方式應(yīng)該是:
#include <jni.h>
#include <string>
extern "C" {
#include "lame.h"
}
前兩個庫的引入是為了之后使用lame庫以及與java層交互提前引入的鸟雏。
使用lame庫
lame庫的使用,只需要有四個操作:
- init览祖,初始化
- encoder崔慧,編碼
- flush,將緩沖區(qū)的內(nèi)容寫出
- close穴墅,關(guān)閉
具體的代碼我這里就不再展開了惶室,我寫了一個demo:AudioHelper,包括錄制和播放音頻玄货,里邊包含了具體代碼皇钞。
到這里這篇文章的介紹就完成了,如果有不當(dāng)之處松捉,敬請指教~