目录
Lame简介
LAME是目前非常优秀的一种MP3编码引擎,在业界,转码成MP3格式的音频文件时,最常用的编码器就是LAME库。当达到320Kbit/s以上时,LAME编码出来的音频质量几乎可以和CD的音质相媲美,并且还能保证整个音频文件的体积非常小,因此若要在移动端平台上编码MP3文件,使用LAME便成为唯一的选择。
编译步骤
1.下载Lame源码
下载地址:https://sourceforge.net/projects/lame/
2.下载NDK
这里需要使用低版本的NDK供后面的编译脚本使用,这里我用的r15c版本,下载地址:https://github.com/android/ndk/wiki/Unsupported-Downloads
3.编写编译脚本
交叉编译脚本如下(其中NDK_ROOT需要配置你自己的NDK路径):
#!/bin/bash
NDK_ROOT=/home/itfitness/Android/NDK/android-ndk-r15c-linux-x86_64/android-ndk-r15c
PREBUILT=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
PLATFORM=$NDK_ROOT/platforms/android-26/arch-arm
export PATH=$PATH:$PREBUILT/bin:$PLATFORM/usr/include
export LDFLAGS="-L$PLATFORM/usr/lib -L$PREBUILT/arm-linux-androideabi/lib -march=armv7-a"
export CFLAGS="-I$PLATFORM/usr/include -march=armv7-a -mfloat-abi=softfp -mfpu=vfp -ffast-math -O2"
export CPPFLAGS="$CFALGS"
export CFLAGS="$CFLAGS"
export CXXFLAGS="$CFLAGS"
export LDFLAGS="$LDFLAGS"
export AS=$PREBUILT/bin/arm-linux-androideabi-as
export LD=$PREBUILT/bin/arm-linux-androideabi-ld
export CXX="$PREBUILT/bin/arm-linux-androideabi-g++ --sysroot=${PLATFORM}"
export CC="$PREBUILT/bin/arm-linux-androideabi-gcc --sysroot=${PLATFORM} -march=armv7-a "
export NM=$PREBUILT/bin/arm-linux-androideabi-nm
export STRIP=$PREBUILT/bin/arm-linux-androideabi-strip
export RANLIB=$PREBUILT/bin/arm-linux-androideabi-ranlib
export AR=$PREBUILT/bin/arm-linux-androideabi-ar
./configure --host=arm-linux \
--disable-shared \
--disable-frontend \
--enable-static \
--prefix=`pwd`/armv7a/
make clean
make
make install
4.执行脚本
这里我编写的脚本名为lameNdk.sh
./lameNdk.sh
这时可能会提示你权限不足需要你将可执行权限给脚本加上
chmod +x ./lameNdk.sh
然后执行编译,编译成功后文件在如下目录
5.引入项目
将include目录拷贝到cpp目录下
将lib下的libmp3lame.a拷贝到项目libs目录下的armeabi-v7a目录
然后调整app下的build.gradle
defaultConfig {
...省略部分代码
externalNativeBuild {
//配置自己写的代码生成的架构类型
cmake {
cppFlags ''
abiFilters 'armeabi-v7a'
}
}
ndk{
//配置第三方库的架构类型,由于我们这里只有armeabi-v7a的因此只配置了它
abiFilters 'armeabi-v7a'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
CMakeLists.txt调整如下:
cmake_minimum_required(VERSION 3.10.2)
project("lamedemo")
#导入头文件(可以让项目找到头文件,这样才能调用函数)
include_directories("${CMAKE_SOURCE_DIR}/include")
#配置动态链接库所在的目录
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}../../../../libs/${ANDROID_ABI}")
add_library( # Sets the name of the library.
lamedemo
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
native-lib.cpp)
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log)
target_link_libraries( # Specifies the target library.
lamedemo
mp3lame
# Links the target library to the log library
# included in the NDK.
${log-lib})
6.测试集成是否成功
通过获取版本号来判断是否集成成功,C代码如下:
#include <jni.h>
#include <string>
#include "lame/lame.h"
extern "C" JNIEXPORT jstring JNICALL
Java_com_itfitness_lamedemo_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
//此处输出lame的版本号
return env->NewStringUTF(get_lame_version());
}
集成成功的话,效果如下,显示Lame的版本号:
网友评论