一、环境的搭建
linux环境
我用的是阿里云的服务器,centos7系统,用ubuntu系统的基本操作也是一样。- 下载ndk,我这里用的是
android-ndk-r10e
,也可以在linux系统上吗直接下载,也可以下载以后传到服务器上面。下载了以后将文件解压到指定的文件夹,然后记住文件的路径,如果是zip的就用unzip命令,如果后缀是gz,就用tar -xzvf xx.tar.gz
配置NDK的环境变量
export NDKROOT=/usr/ndk/android-ndk-r10e export PATH=$NDKROOT:$PATH
配置java的环境变量
77 #set java environment 78 JAVA_HOME=/usr/java/jdk1.8.0_72 79 JRE_HOME=$JAVA_HOME/jre 80 CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib 81 PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin 82 export JAVA_HOME JRE_HOME CLASS_PATH PATH
- 下载ndk,我这里用的是
二、编译生成多个库
- 上ffmpeg的官网下载源文件,下载以后上传到服务器上面的制定文件夹,我这里面是usr/shixin。上传以后解压。
- 接下来就是编写shell脚本。使用vim新建一个文件,然后编写shell脚本,命令如下
vim build_android.sh
。 脚本如下
#!/bin/bash #全局变量,多个shell脚本都可以使用 注意这里的路径要换上自己的路径 export ANDROID_NDK_HOME=/usr/ndk/android-ndk-r10e export PLATFORM_VERSION=android-9 #android的版本 function build_ffmpeg { echo "start build ffmpeg $ARCH" ./configure --target-os=linux \ --prefix=$PREFIX \ #编译放到哪一个目录下面 --arch=$ARCH \ #指定CPU的架构 --enable-shared \ #代表生成的是动态库 --disable-static \ #不生成静态库 --disable-yasm \ #不需要这个 --disable-ffmpeg \ #下面这几个都不需要生成 --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ #流媒体服务器推流的,不生成 --disable-doc \ --enable-cross-compile \ #交叉编译,在linux下编译arm指令 就是交叉编译,所以要指定ndk下的arm路径。还有就是在win下面编译linux。 --cross-prefix=$CROSS_COMPILE \ #配置这个选项,需要一些工具,在ndk里面。 --sysroot=$PLATFORM \ --extra-cflags="-fpic" #可以让动态库加入使用 make clean #makefile的指令 make make install echo "build finished $ARCH" } #arm 编译arm指令 ARCH=arm CPU=arm PREFIX=$(pwd)/android/$CPU TOOLCHAIN=$ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi- PLATFORM=$ANDROID_NKD_HOME/platforms/$PLATFORM_VERSION/arch-$ARCH build_ffmpeg #x86 ARCH=x86 CPU=x86 PREFIX=$(pwd)/android/$CPU TOOLCHAIN=$ANDROID_NDK_HOME/toolchains/x86-4.9/prebuilt/linux-x86_64 CROSS_COMPILE=$TOOLCHAIN/bin/i686-linux-android- PLATFORM=$ANDROID_NKD_HOME/platforms/$PLATFORM_VERSION/arch-$ARCH build_ffmpeg
- 修改configure文件,在ffmpeg的文件夹下面
2861行
#SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
#LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"' #SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)' #SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)' #shixin SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
执行命令
给文件权限 chmod 777 -R ffmpeg-2.6.9 chmod u+x build_android.sh ./build_android.sh
运行的时间大概是半个小时,如果服务器的性能比较高的话,速度会快一些。运行完成以后会在ffmpeg文件夹下面生成一个android的文件夹,在那里会生成一些动态库来给我们调用。
生成调试版本的动态库
#!/bin/bash
make clean
export NDK=/usr/ndk/android-ndk-r10e
export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
export CPU=arm
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
./configure --target-os=linux \
--prefix=$PREFIX --arch=arm \
--disable-doc \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-symver \
--enable-gpl \
--enable-debug \ #debug版本
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
注意事项
- 首先要给ffmpeg文件执行权限,如果没有权限没法执行,直接简单粗暴一点
chmod 777 -R ffmpeg-2.6.9
- 还要给予shell脚本的执行权限
chmod u+x build_android.sh
,否则没有办法编译通过。 - shell脚本语法特别严谨,其中
\
后面不能有空格,同样的--
前面也不能有空格。 \
符号相当于换行符。- 编写shell脚本是可以用
./configure --help
查看帮助。
三、编译生成一个库
这个脚本文件是借鉴雷神的博客。
1 #!/bin/bash
2 make clean
7 export cpu=arm
8 export PREFIX=$(pwd)/as/$cpu
1 #!/bin/bash
2 make clean
7 export cpu=arm
8 export PREFIX=$(pwd)/as/$cpu
9 build_one(){
10 ./configure --target-os=linux --prefix=$PREFIX \
11 --enable-cross-compile \
12 --enable-runtime-cpudetect \
13 --disable-asm \
14 --arch=arm \
15 --cc=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-gcc \
16 --cross-prefix=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi- \
17 --disable-stripping \
18 --nm=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-nm \
19 --sysroot=$PLATFORM \
20 --enable-gpl --enable-static --disable-shared --enable-nonfree --enable-version3 --enable-small \
21 --enable-zlib --disable-ffprobe --disable-ffplay --disable-ffmpeg --disable-ffserver --disable-debug \
22 --extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv7-a"
23 }
24
25 makeclean
26
27 build_one
28
29 make
30 make install
31
32 $PREBUILT/linux-x86_64/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib -soname libffmpeg.so -shar ed -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 libpostproc/libpostproc.a libavdevice/libavdevice.a - lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker $PREBUILT/linux-x86_64/lib/gcc/arm-linux-androideabi/4.8/libgcc.a
资源位置:shell脚本下载
传送门