第一步下载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);