第一步下載libmp3lame源碼。
https://sourceforge.net/projects/lame/files/latest/download
第二步:賦值libmp3lame和include目錄下的所有的擴展名爲c和h的文件到AndroidStudio中。
#CMakeLists.txt文件:
# 這裏指定了CMake的最低版本爲3.4.1
cmake_minimum_required(VERSION 3.4.1)
#該變量爲真時會創建完整版本的Makefile
set(CMAKE_VERBOSE_MAKEFILE on)
set(LAME_LIBMP3_DIR ${CMAKE_SOURCE_DIR}/src/main/jni/libmp3lame)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DLOGTEST")
include_directories(${CMAKE_SOURCE_DIR}/src/main/jni/libmp3lame)
include_directories(${CMAKE_SOURCE_DIR}/src/main/jni)
# 這裏用來添加一個庫
add_library(# 這裏設置so庫的名稱爲native-lib
libmp3lame
# 這裏設置該庫爲共享
SHARED
#源碼文件
${LAME_LIBMP3_DIR}/bitstream.c
${LAME_LIBMP3_DIR}/encoder.c
${LAME_LIBMP3_DIR}/fft.c
${LAME_LIBMP3_DIR}/gain_analysis.c
${LAME_LIBMP3_DIR}/id3tag.c
${LAME_LIBMP3_DIR}/lame.c
${LAME_LIBMP3_DIR}/mpglib_interface.c
${LAME_LIBMP3_DIR}/newmdct.c
${LAME_LIBMP3_DIR}/presets.c
${LAME_LIBMP3_DIR}/psymodel.c
${LAME_LIBMP3_DIR}/quantize.c
${LAME_LIBMP3_DIR}/quantize_pvt.c
${LAME_LIBMP3_DIR}/reservoir.c
${LAME_LIBMP3_DIR}/set_get.c
${LAME_LIBMP3_DIR}/tables.c
${LAME_LIBMP3_DIR}/takehiro.c
${LAME_LIBMP3_DIR}/util.c
${LAME_LIBMP3_DIR}/vbrquantize.c
${LAME_LIBMP3_DIR}/VbrTag.c
${LAME_LIBMP3_DIR}/version.c
)
#這裏用來添加一個庫
add_library(# 這裏設置so庫的名稱爲native-lib
eng100
# 這裏設置該庫爲共享
SHARED
src/main/jni/libmp3lame.cpp
)
# 這裏用來查找一個庫,並設置到路徑變量中去
find_library( # 設置路徑變量
log-lib
# 你希望CMake編譯器加載的NDK函數庫
log )
# 將一個庫關聯到目標函數庫中
target_link_libraries(# 目標函數庫
eng100
libmp3lame
# 想要在目標函數庫中使用的函數庫,其中${路徑變量}
${log-lib} )
#build.gradle文件中添加:
externalNativeBuild {
cmake {
cFlags "-DSTDC_HEADERS"
cppFlags "-std=c++11 -frtti -fexceptions"
abiFilters 'arm64-v8a','armeabi-v7a','x86','x86_64'
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
sourceSets {
main {
jni.srcDirs = ['src/main/jni']
}
}
第三步:更改libmp3lame源碼文件,不然編譯會報錯。
①刪除 fft.c 文件的 47 行的 include“vector/lame_intrin.h”
②修改 set_get.h 文件的 24 行的 #include“lame.h”
③將 util.h 文件的 574 行的”extern ieee754_float32_t fast_log2(ieee754_float32_t x);” 替換爲 “extern float fast_log2(float x);”
第四步:編譯,生成so文件。
#c++代碼:
#include <jni.h>
#include "AndroidLog.h"
#include "lame.h"
static lame_global_flags *lame;
extern "C" JNIEXPORT void JNICALL
Java_com_wh_xy_mp3recorder_LameUtils_init(JNIEnv *env, jclass type, jint inSamplerate,
jint inChannel, jint outSamplerate, jint outBitrate,
jint quality) {
LOGI("%s","Java_com_wh_xy_mp3recorder_LameUtils_init");
if (lame != NULL) {
lame_close(lame);
lame = NULL;
}
lame = lame_init();
lame_set_in_samplerate(lame, inSamplerate);
lame_set_num_channels(lame, inChannel);//輸入流的聲道
lame_set_out_samplerate(lame, outSamplerate);
lame_set_brate(lame, outBitrate);
lame_set_quality(lame, quality);
lame_init_params(lame);
}
#java代碼
static{
System.loadLibrary("libmp3lame");
}
public native static void init(int inSamplerate, int inChannel,
int outSamplerate, int outBitrate, int quality);