美文网首页
Linux交叉编译Android可用的LAME库

Linux交叉编译Android可用的LAME库

作者: itfitness | 来源:发表于2022-01-18 17:20 被阅读0次

    目录

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


    案例源码

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

    相关文章

      网友评论

          本文标题:Linux交叉编译Android可用的LAME库

          本文链接:https://www.haomeiwen.com/subject/idwkhrtx.html