單個SO文件
1. 編譯o文件
--disable-shared \ --enable-static \
因爲最後會將文件合成libffmpeg.so文件,所以就不需要去改configure文件了!!
2. 這些o文件link到一起,變成libffmpeg.so文件
$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 \ libswresample/libswresample.a \ libavformat/libavformat.a \ libavutil/libavutil.a \ libswscale/libswscale.a \ libavdevice/libavdevice.a \ -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \ $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a
結果
編譯結果.png
3. 開啓文件大小優化
$TOOLCHAIN/bin/arm-linux-androideabi-strip $PREFIX/libffmpeg.so
完整的腳本
#!/bin/bash NDK=/Users/Cry/Library/Android/sdk/android-ndk-r14b SYSROOT=$NDK/platforms/android-14/arch-arm/ TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 CPU=arm # PREFIX=$(pwd)/android/$CPU PREFIX=/Users/Cry/Documents/FFmpeg/1017/small_one_strip/$CPU ADDI_CFLAGS=" -I$SYSROOT/usr/include" ADDI_LDFLAGS="" function build_arm { ./configure \ --prefix=$PREFIX \ --disable-shared \ --enable-static \ --disable-encoders \ --disable-muxers \ --disable-decoders \ --enable-decoder=h264 \ --enable-decoder=aac \ --disable-demuxers \ --enable-demuxer=mov \ --enable-demuxer=m4a \ --disable-parsers \ --enable-parser=aac \ --enable-parser=h264 \ --disable-protocols \ --enable-protocol=file \ --disable-filters \ --enable-filter=scale \ --disable-doc \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-symver \ --disable-avresample \ --enable-small \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --target-os=linux \ --arch=arm \ --enable-cross-compile \ --sysroot=$SYSROOT \ --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ --extra-ldflags="$ADDI_LDFLAGS" \ $ADDITIONAL_CONFIGURE_FLAG make clean make 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 \ libswresample/libswresample.a \ libavformat/libavformat.a \ libavutil/libavutil.a \ libswscale/libswscale.a \ libavdevice/libavdevice.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 "compile complete!!" } build_arm
結果
編譯結果.png
NDK version >14
表現
直接使用nkd大於14版本的進行編譯時
問題表現.png
原因
https://android.googlesource.com/platform/ndk/+/ndk-r15-release/docs/UnifiedHeaders.md
解決方案
1. 使用小於ndk15的ndk來進行編譯
Android NDK, Revision 14b (March 2017)
- Windows 32-bit android-ndk-r14b-windows-x86.zip
- Windows 64-bit android-ndk-r14b-windows-x86_64.zip
- Mac OS X android-ndk-r14b-darwin-x86_64.zip
- Linux 64-bit (x86) android-ndk-r14b-linux-x86_64.zip
2. 使用 Standalone Toolchains
- 使用腳本,預編譯出需要使用的toolchain
STANDALONE_DIR=/tmp/my-android-toolchain/ API=14 TARGET = arm function standalone{ $NDK/build/tools/make-standalone-toolchain.sh \ --arch=$TARGET --platform=android-$API --install-dir=$STANDALONE_DIR } standalone
- 修改編譯腳本對應路徑,開始編譯
SYSROOT=$STANDALONE_DIR/sysroot TOOLCHAIN=$STANDALONE_DIR
完整的腳本
注意這裏是編譯生產多個so文件的腳本。同時需要去改configure文件!!
#!/bin/bash NDK=/Users/Cry/Library/Android/sdk/ndk-bundle STANDALONE_DIR=/private/tmp/my-android-toolchain/ SYSROOT=$STANDALONE_DIR/sysroot TOOLCHAIN=$STANDALONE_DIR TRIPLE=arm-linux-androideabi API=14 TARGET = arm CPU=arm # PREFIX=$(pwd)/android/$CPU PREFIX=/Users/Cry/Documents/FFmpeg/1017/small_new/$CPU ADDI_CFLAGS="" ADDI_LDFLAGS="" ADDITIONAL_CONFIGURE_FLAG="" function standalone{ ./$NDK/build/tools/make-standalone-toolchain.sh \ --arch=$TARGET --platform=android-$API --install-dir=$STANDALONE_DIR } standalone function build_arm { ./configure \ --prefix=$PREFIX \ --enable-shared \ --disable-static \ --disable-encoders \ --disable-muxers \ --disable-decoders \ --enable-decoder=h264 \ --enable-decoder=aac \ --disable-demuxers \ --enable-demuxer=mov \ --enable-demuxer=m4a \ --disable-parsers \ --enable-parser=aac \ --enable-parser=h264 \ --disable-protocols \ --enable-protocol=file \ --disable-filters \ --enable-filter=scale \ --disable-doc \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-symver \ --disable-avresample \ --enable-small \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --target-os=linux \ --arch=arm \ --enable-cross-compile \ --sysroot=$SYSROOT \ --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ --extra-ldflags="$ADDI_LDFLAGS" \ $ADDITIONAL_CONFIGURE_FLAG make clean make make install } build_arm
缺陷
當編譯成一個SO文件時,報錯如下
編譯成單個SO時報錯.png
因爲新版本的Ndk改了對應的方法,變成了內聯函數。所以會找不到應用。 暫時沒找到辦法解決。