NDK使用之引用c/c++開源庫

本文以使用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)之處,敬請指教~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容