本文以使用lame庫為例,這是一個音頻編碼為mp3的開源庫,首先下載需要的版本,這里是下載地址:目前最新是lame_3.100。
由于lame的源碼比較少,可以采用直接引用源碼的方式,無需編譯成so庫再使用,所以本文介紹的也是引用源碼的方式使用c/c++開源庫,至于像ffmpeg這類的有大量源碼的開源庫就只能先變成出so庫再使用,這種方式會在下一篇文章中介紹。
很多時候在項目中一開始可能并不會有ndk開發(fā)的需求,所以一開始創(chuàng)建的項目并不支持ndk,所以本文會以普通module來一步一步引入使用,接下來進(jìn)入正文。
支持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)之處,敬請指教~