文章目录
- 1. 环境
- 2. 解压
- 3.编译
- 4.交叉编译生成so库
- 5 补充说明
1. 环境
操作系统:ubuntu和windows10
工具:xftp,VMWARE
ffmpeg3.3版本和ndk-r14b版本亲测成功。
其他的高版本测试失败了,ffmpeg版本高了也失败。所以版本尽量低点,反正开发够用了。
具体版本请以自己的编译环境为基础进行选择,千万不要在ubuntu环境下编译而自己下载了windows系统版本的ndk和ffmpeg。欸我就是这样踩着坑过来的,就这章的内容,我估计搞了三个晚上吧,当然白天都在上班。
2. 解压
tar -zxvf ffmpeg-3.3.tar.zg
unzip android-ndk-r14b.zip
3.编译
1.修改config文件
# 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)'
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
问题1:
gcc is unable to create an executable file.
If gcc is a cross-compiler, use the --enable-cross-compile option.
Only do this if you know what cross compiling means.
C compiler test failed.
解决方法:
sudo apt install gcc
问题2:
解决方法:
(1) 下载yasm最新版本,下载后上传yasm至ubuntu系统之中,与ffmpeg同级吧。为什么不使用wget下载,因为实在太慢。
(2)输入tar -xvf yasm-1.3.0.tar.gz来解压yasm-1.3.0.tar.gz文件
(3) 输入cd yasm-1.3.0切换到yasm-1.3.0目录,然后./configure创建配置文件
(4)执行 make && make install 安装。
如果没有安装make,则apt install make,后执行步骤(4)。
2.生成头文件
./configure
如上图,即代表头文件啥的生成完成了。可以编写编译脚本了。
3. 编译脚本
只需要修改NDK存放路径就行。下面的sh脚本是生成动态链接库的,如果要生成静态的,则--disable-shared \ --enable-static \ 改一下disable和enbale的位置就行
。
#!/bin/bash
make clean
export NDK=/home/lvan/projects/ffmpeg/android-ndk-r18b
export SYSROOT=$NDK/platforms/android-16/arch-arm
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
export TMPDIR="D:/FFmpeg/temp"
./configure --target-os=linux \
--prefix=$PREFIX --arch=arm \
--disable-doc \
--disable-shared \
--enable-static \
--disable-yasm \
--disable-symver \
--enable-gpl \
--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_CFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make install
4.交叉编译生成so库
将上面的脚本build_android.sh放到ffmpeg解压后的目录下。然后
chmod 777 build_android.sh
再转下格式
dos2unix ./build_android.sh
如果没有安装dos2unix工具的安装一下再执行。
然后就是进行交叉编译了
./build_android.sh
5 补充说明
如果,编译后会得到以.a结尾的文件,而不是以点so结尾,那么请将build_android.sh中的
--disable-shared \
--enable-static \
改为
--enable-shared \
--disable-static \
重新配置configure文件后编译即可
如果报如下错误
***...arm-linux-androideabi-gcc is unable to create an executable file. C compiler
且对应目录下存在了arm-linux-androideabi-gcc.exe文件的,就不要看网上那些教程了,我这给你们看看我入的坑。
首先:
在build.sh中添加如下一行代码,大概意思是想把gcc程序引入进来。位置是在–enable 那几行都可以
--extra-libs=-lgcc \
但是,神他妈不知道啥环境才能生效,我在ubuntu系统中没生效,第一种方法宣告失败。
接着入坑第二种。
export TMPDIR="E:/FFmpeg/jni/temp"
就是引入一个临时文件夹,这个大概是在windows环境下编译才会用到,我加进去之后的确没有报gcc错误,但是神尼玛报错说不能创建该临时文件夹,哪怕我存放的目录是在ubuntu系统中的目录并且我自己创建好了也不行。
最后还是老老实实的将低ffmpeg和ndk的版本吧。
附上一张静态库和动态库都生成的截图,代表我编译成功了,并没有瞎扯(●’◡’●)
亲测ndk-linux-r14b 与ffmpeg3.3.1 交叉编译成功,大家可以选择这两个版本来玩玩。