将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
:
1 2 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 文件配置
1 2 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