Ubuntu系统下交叉编译Android的Lame库

Ubuntu交叉编译Lame库到Android

 本次交叉编译是在Ubuntu20.4上进行的。

一、下载lame的源码:

        进入官网:https://sourceforge.net/projects/lame/files/lame/

        选择3.100版本的

        在ubuntu解压lame:

  tar -xzf lame-3.100.tar.gz

二、下载及安装NDK:

        
         在NDK 下载NDK 下载  |  Android NDK  |  Android Developers下载Liunx平台的NDK。

         本次交叉编译下载的android-ndk-r28c-linux.zip版本的。

        下载解压后安装,具体的过程在前面的文章已经做介绍,需要的可详细查看文章:

               Ubuntu系统下交叉编译Android的X265库
 

三、创建脚本android_lame_build.sh:

        进入lame-3.100的文件下创建android_lame_build.sh。

        android_lame_build.sh编译脚本代码如下:

#!/bin/bash

# 设置变量
NDK_HOME=/home/wyy/Android/android-ndk-r28c
SYSTEM=linux-x86_64
#HOST=aarch64-linux-android
#ARCH=arm64-v8a
API=24
TOOLCHAIN=${NDK_HOME}/toolchains/llvm/prebuilt/${SYSTEM}


# 目标架构 (可修改为: arm-v7a arm64-v8a x86 x86_64)
ARCH=${1:-"arm-v7a"}
#ARCH=${1:-"arm64-v8a"}

# 设置目标架构相关参数
case $ARCH in
    arm-v7a)
        HOST="armv7a-linux-androideabi"
        ARCH="armeabi-v7a"
        CPU="armv7-a"
        ;;
    arm64-v8a)
        HOST="aarch64-linux-android"
        ARCH="arm64-v8a"
        CPU="armv8-a"
        ;;
    x86)
        HOST="i686-linux-android"
        ABI="x86"
        CPU="i686"
        ;;
    x86_64)
        HOST="x86_64-linux-android"
        ARCH="x86_64"
        CPU="x86-64"
        ;;
    *)
        echo "不支持的架构: $ARCH"
        echo "支持的架构: arm-v7a, arm64-v8a, x86, x86_64"
        exit 1
        ;;
esac

# 输出目录
PREFIX="$(pwd)/android-build/${ARCH}"
mkdir -p ${PREFIX}

# 设置工具链
export AR=${TOOLCHAIN}/bin/llvm-ar
export CC=${TOOLCHAIN}/bin/${HOST}${API}-clang
export CXX=${TOOLCHAIN}/bin/${HOST}${API}-clang++
export LD=${TOOLCHAIN}/bin/ld
export AS=${CC}
export RANLIB=${TOOLCHAIN}/bin/llvm-ranlib
export STRIP=${TOOLCHAIN}/bin/llvm-strip

# 设置编译标志
export CFLAGS="-fPIC -O3"
export LDFLAGS="-pie"

echo "配置 LAME for Android ${ARCH}..."
./configure \
    --host=${HOST} \
    --target=${HOST} \
    --enable-shared \
    --enable-static \
    --prefix=${PREFIX} \
    --disable-frontend  # 禁用前端程序(不需要用于Android)

if [ $? -ne 0 ]; then
    echo "配置失败!"
    exit 1
fi

# 修复版本脚本问题 - 移除对未定义符号的引用
echo "修复版本脚本问题..."
if [ -f "include/libmp3lame.sym" ]; then
    # 移除对 lame_init_old 的引用
    sed -i '/lame_init_old/d' include/libmp3lame.sym
    echo "已修复 include/libmp3lame.sym"
fi

echo "编译 LAME..."
make clean
make -j$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)

if [ $? -ne 0 ]; then
    echo "编译失败!"
    # 如果仍然失败,尝试禁用版本脚本
    echo "尝试禁用版本脚本..."
    make clean
    # 重新配置,禁用版本脚本
    ./configure \
        --host=${HOST} \
        --target=${HOST} \
        --enable-shared \
        --enable-static \
        --prefix=${PREFIX} \
        --disable-frontend \
        --disable-version-script  # 禁用版本脚本
    
    make -j$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)
    
    if [ $? -ne 0 ]; then
        echo "仍然编译失败!"
        exit 1
    fi
fi

echo "安装 LAME 到 ${PREFIX}..."
make install

if [ $? -ne 0 ]; then
    echo "安装失败!"
    exit 1
fi

echo "LAME 已成功编译并安装到 ${PREFIX}"

     

四、编译android_lame_build.sh:

        修改脚本的代码分别对arm-v7a、arm64-v8a架构编译:

# 目标架构 (可修改为: arm-v7a arm64-v8a x86 x86_64)
ARCH=${1:-"arm-v7a"}
#ARCH=${1:-"arm64-v8a"}

        sh编译脚本:

    sudo sh android_lame_build.sh 

五、编译结果:

        编译完成后在android-buildw文件夹下生成arm-v7a、arm64-v8a两个架构的编译结果:

        

六、在编译FFmpeg过程中加入第三方lame库编译:

         此次编译是基于文章 Ubuntu系统下交叉编译Android的X264库android_x264_build.sh基础上进行改造编译的,感兴趣的可以翻回去回顾一下具体内容。

#!/bin/bash
# 用于编译android平台的脚本

# NDK所在目录
NDK_PATH=/home/wyy/Android/android-ndk-r28c
# 主机平台
HOST_PLATFORM=linux-x86_64
# minSdkVersion
API=24  # 提高到 API 24 以避免 fseeko64/ftello64 问题

TOOLCHAINS="$NDK_PATH/toolchains/llvm/prebuilt/$HOST_PLATFORM"
SYSROOT="$NDK_PATH/toolchains/llvm/prebuilt/$HOST_PLATFORM/sysroot"
# 生成 -fpic 与位置无关的代码
CFLAG="-D__ANDROID_API__=$API -Os -fPIC -DANDROID -D_FILE_OFFSET_BITS=64"
LDFLAG="-lc -lm -ldl -llog "

# 输出目录
PREFIX=$(pwd)/android_build
# 日志输出目录
CONFIG_LOG_PATH=${PREFIX}/log
# 公共配置
COMMON_OPTIONS=
# 交叉配置
CONFIGURATION=

# 第三方库路径
X264_BASE_PATH="/home/wyy/X264/x264/android_build"
LAME_BASE_PATH="/home/wyy/mp3lame/lame-3.100/android-build"

# 创建必要的目录
mkdir -p ${PREFIX} ${CONFIG_LOG_PATH}

build() {
  APP_ABI=$1
  echo "======== > Start build $APP_ABI"
  
  # 重置变量
  EXTRA_CFLAGS="$CFLAG"
  EXTRA_LDFLAGS="$LDFLAG"
  EXTRA_OPTIONS=""
  
  case ${APP_ABI} in
  armeabi-v7a)
    ARCH="arm"
    CPU="armv7-a"
    MARCH="armv7-a"
    TARGET=armv7a-linux-androideabi
    CC="$TOOLCHAINS/bin/$TARGET$API-clang"
    CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"
    LD="$TOOLCHAINS/bin/$TARGET$API-clang"
    # 交叉编译工具前缀
    CROSS_PREFIX="$TOOLCHAINS/bin/arm-linux-androideabi-"
    
    # 设置架构特定路径
    X264_ARCH_PATH="$X264_BASE_PATH/arm-v7a"
    LAME_ARCH_PATH="$LAME_BASE_PATH/armeabi-v7a"
    
    # 添加架构特定标志
    EXTRA_CFLAGS="$EXTRA_CFLAGS -mfloat-abi=softfp -mfpu=neon -marm -march=$MARCH"
    EXTRA_OPTIONS="--enable-neon --cpu=$CPU"
    ;;
    
  arm64-v8a)
    ARCH="aarch64"
    CPU="armv8-a"
    TARGET=aarch64-linux-android
    CC="$TOOLCHAINS/bin/$TARGET$API-clang"
    CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"
    LD="$TOOLCHAINS/bin/$TARGET$API-clang"
    CROSS_PREFIX="$TOOLCHAINS/bin/aarch64-linux-android-"
    
    # 设置架构特定路径
    X264_ARCH_PATH="$X264_BASE_PATH/arm64-v8a"
    LAME_ARCH_PATH="$LAME_BASE_PATH/arm64-v8a"
    ;;
    
    
  esac

  # 设置x264和lame的路径
  X264_INCLUDE="$X264_ARCH_PATH/include"
  X264_LIB="$X264_ARCH_PATH/lib"
  LAME_INCLUDE="$LAME_ARCH_PATH/include"
  LAME_LIB="$LAME_ARCH_PATH/lib"
  
  echo "-------- > X264_INCLUDE: $X264_INCLUDE"
  echo "-------- > X264_LIB: $X264_LIB"
  echo "-------- > LAME_INCLUDE: $LAME_INCLUDE"
  echo "-------- > LAME_LIB: $LAME_LIB"
  
  
  
  # 检查x264库是否存在
  if [ ! -f "$X264_LIB/libx264.so" ]; then
      echo "错误: 找不到x264共享库文件在 $X264_LIB"
      echo "请先编译x264库或检查路径是否正确"
      return 1
  fi
  
  # 检查lame库是否存在
  if [ ! -f "$LAME_LIB/libmp3lame.so" ]; then
      echo "错误: 找不到mp3lame共享库文件在 $LAME_LIB"
      echo "请先编译mp3lame库或检查路径是否正确"
      return 1
  fi
  
  # 设置pkg-config路径
  export PKG_CONFIG_PATH="$X264_LIB/pkgconfig:$LAME_LIB/pkgconfig"
  
  # 尝试使用pkg-config获取x264标志
  if pkg-config --exists x264; then
      X264_CFLAGS=$(pkg-config --cflags x264)
      X264_LIBS=$(pkg-config --libs x264)
      echo "-------- > 使用pkg-config获取x264标志"
  else
      echo "-------- > pkg-config找不到x264,使用手动标志"
      X264_CFLAGS="-I$X264_INCLUDE"
      X264_LIBS="-L$X264_LIB -lx264"
  fi
  
  # 添加x264和lame标志
  EXTRA_CFLAGS="$EXTRA_CFLAGS $X264_CFLAGS -I$LAME_INCLUDE"
  EXTRA_LDFLAGS="$EXTRA_LDFLAGS $X264_LIBS -L$LAME_LIB -lmp3lame"

  echo "-------- > Start clean workspace"
  make clean > /dev/null 2>&1

  echo "-------- > Start build configuration"
  CONFIGURATION="$COMMON_OPTIONS"
  CONFIGURATION="$CONFIGURATION --logfile=$CONFIG_LOG_PATH/config_$APP_ABI.log"
  CONFIGURATION="$CONFIGURATION --prefix=$PREFIX"
  CONFIGURATION="$CONFIGURATION --libdir=$PREFIX/libs/$APP_ABI"
  CONFIGURATION="$CONFIGURATION --incdir=$PREFIX/includes/$APP_ABI"
  CONFIGURATION="$CONFIGURATION --pkgconfigdir=$PREFIX/pkgconfig/$APP_ABI"
  CONFIGURATION="$CONFIGURATION --cross-prefix=$CROSS_PREFIX"
  CONFIGURATION="$CONFIGURATION --arch=$ARCH"
  CONFIGURATION="$CONFIGURATION --sysroot=$SYSROOT"
  CONFIGURATION="$CONFIGURATION --cc=$CC"
  CONFIGURATION="$CONFIGURATION --cxx=$CXX"
  CONFIGURATION="$CONFIGURATION --ld=$LD"
  
  # nm 和 strip
  CONFIGURATION="$CONFIGURATION --nm=$TOOLCHAINS/bin/llvm-nm"
  CONFIGURATION="$CONFIGURATION --strip=$TOOLCHAINS/bin/llvm-strip"
  CONFIGURATION="$CONFIGURATION $EXTRA_OPTIONS"
  
  echo "-------- > Start config makefile with $CONFIGURATION"
  echo "-------- > Extra CFLAGS: $EXTRA_CFLAGS"
  echo "-------- > Extra LDFLAGS: $EXTRA_LDFLAGS"
  
  ./configure ${CONFIGURATION} \
    --extra-cflags="$EXTRA_CFLAGS" \
    --extra-ldflags="$EXTRA_LDFLAGS" \
    --pkg-config=$(which pkg-config) 2>&1 | tee $CONFIG_LOG_PATH/configure_$APP_ABI.log
    
  # 检查configure是否成功
  if [ $? -ne 0 ]; then
      echo "-------- > Configure failed for $APP_ABI"
      return 1
  fi
  
  echo "-------- > Start make $APP_ABI with -j4"
  make -j4
  if [ $? -ne 0 ]; then
      echo "-------- > Make failed for $APP_ABI"
      return 1
  fi
  
  echo "-------- > Start install $APP_ABI"
  make install
  if [ $? -ne 0 ]; then
      echo "-------- > Install failed for $APP_ABI"
      return 1
  fi
  
  echo "++++++++ > make and install $APP_ABI complete."
  return 0
}

build_all() {
  #配置开源协议声明
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-gpl"
  #目标android平台
  COMMON_OPTIONS="$COMMON_OPTIONS --target-os=android"
  #取消默认的静态库
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-static"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-shared"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-protocols"
  #开启交叉编译
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-cross-compile"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-optimizations"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-debug"
  #尽可能小
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-small"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-doc"
  #不要命令(执行文件)
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-programs"  # do not build command line programs
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffmpeg"    # disable ffmpeg build
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffplay"    # disable ffplay build
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-ffprobe"   # disable ffprobe build
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-symver"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-network"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-x86asm"
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-vulkan"
  
  # 有条件地禁用asm,某些架构可能不支持
  COMMON_OPTIONS="$COMMON_OPTIONS --disable-asm"
  
  #启用
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-pthreads"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-mediacodec"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-jni"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-zlib"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-pic"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-muxer=flv"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=h264"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=mpeg4"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=mjpeg"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=png"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=vorbis"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=opus"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=flac"
  
  #启用编码器
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-encoder=h264"
  
  #libx264
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-libx264"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-encoder=libx264"
  
  #mp3lame
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-libmp3lame"
  COMMON_OPTIONS="$COMMON_OPTIONS --enable-encoder=libmp3lame"
  
  echo "COMMON_OPTIONS=$COMMON_OPTIONS"
  echo "PREFIX=$PREFIX"
  echo "CONFIG_LOG_PATH=$CONFIG_LOG_PATH"

  # 构建所有支持的架构
  build "armeabi-v7a" || echo "Failed to build armeabi-v7a"
 # build "arm64-v8a" || echo "Failed to build arm64-v8a"
}

echo "-------- Start --------"
build_all
echo "-------- End --------"

七、编译结果的验证:

        在本人github项目中可验证lame是否编译到ffmpeg中:

        https://github.com/wangyongyao1989/FFmpegPractices

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值