将FFmpeg编译成一个libffmpeg.so库
    
  
      
      
      
      
    
    
      
          
        概述
在上一篇文章 Android NDK交叉编译FFmpeg 中,编译出的FFmpeg有好几个库,使用起来比较麻烦,所以这篇文章将要介绍如何将FFmpeg编译成一个单独的libffmpeg.so库。
编译环境
- Mac OS X  10.13.6
- android-ndk-r17b
- FFmpeg 4.0.2
编译脚本
build-android-ffmpeg.sh:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 
 | #!/bin/bash
 
 export NDK=/Users/xch/debug/ndk/android-ndk-r17b
 export SYSROOT=$NDK/platforms/android-21/arch-arm
 export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
 CPU=armv7-a
 
 ISYSROOT=$NDK/sysroot
 ASM=$ISYSROOT/usr/include/arm-linux-androideabi
 
 
 export PREFIX=$(pwd)/android/$CPU
 ADDI_CFLAGS="-marm"
 
 function build_android
 {
 echo "开始编译ffmpeg"
 
 ./configure \
 --target-os=linux \
 --prefix=$PREFIX \
 --enable-cross-compile \
 --enable-static \
 --disable-shared \
 --disable-doc \
 --disable-ffmpeg \
 --disable-ffplay \
 --disable-ffprobe \
 --disable-avdevice \
 --disable-doc \
 --disable-symver \
 --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
 --arch=arm \
 --sysroot=$SYSROOT \
 --extra-cflags="-I$ASM -isysroot $ISYSROOT -D__ANDROID_API__=21 -U_FILE_OFFSET_BITS -Os -fPIC -DANDROID -Wno-deprecated -mfloat-abi=softfp -marm" \
 --extra-ldflags="$ADDI_LDFLAGS" \
 $ADDITIONAL_CONFIGURE_FLAG
 
 make clean
 
 make -j16
 make install
 
 
 $TOOLCHAIN/bin/arm-linux-androideabi-ld \
 -rpath-link=$SYSROOT/usr/lib \
 -L$SYSROOT/usr/lib \
 -L$PREFIX/lib \
 -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
 $PREFIX/libffmpeg.so \
 libavcodec/libavcodec.a \
 libavfilter/libavfilter.a \
 libavformat/libavformat.a \
 libavutil/libavutil.a \
 libswresample/libswresample.a \
 libswscale/libswscale.a \
 -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
 $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a
 
 
 $TOOLCHAIN/bin/arm-linux-androideabi-strip  $PREFIX/libffmpeg.so
 
 echo "编译结束!"
 }
 
 build_android
 
 | 
Note: 这个脚本不再需要修改Configure的内容(生成的是.a而不是.so,并没有涉及到版本号问题)
编译结果

CMakeLists.txt 文件配置
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 
 | cmake_minimum_required(VERSION 3.4.1)
 
 add_library( FFmpegUtil
 SHARED
 src/main/cpp/native-lib.cpp )
 
 
 find_library( log-lib
 log )
 
 find_library( android-lib
 android )
 
 
 set(distribution_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI})
 
 add_library( libffmpeg
 SHARED
 IMPORTED )
 set_target_properties( libffmpeg
 PROPERTIES IMPORTED_LOCATION
 ${distribution_DIR}/libffmpeg.so)
 
 
 
 include_directories(src/main/jniLibs/include)
 
 
 target_link_libraries( FFmpegUtil
 libffmpeg
 ${log-lib}
 ${android-lib} )
 
 | 
可以看出cmake文件的配置简洁了许多。
参考链接
- Android最简单的基于FFmpeg的例子(三)—编译FFmpeg成一个SO库
- ffmpeg编译成android的单独的libffmpeg.so