Linux交叉编译Android可用的LAME库

目录

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 
#include 
#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的版本号:


案例源码

https://gitee.com/itfitness/lame-demo

你可能感兴趣的:(Linux交叉编译Android可用的LAME库)