文章目录

  • 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:

android 编译后怎么知道libs 中的so文件 安卓编译后生成的文件_安卓


解决方法:

(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

android 编译后怎么知道libs 中的so文件 安卓编译后生成的文件_ffmpeg_02


如上图,即代表头文件啥的生成完成了。可以编写编译脚本了。

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 \

android 编译后怎么知道libs 中的so文件 安卓编译后生成的文件_linux_03


重新配置configure文件后编译即可

如果报如下错误

***...arm-linux-androideabi-gcc is unable to create an executable file. C compiler

且对应目录下存在了arm-linux-androideabi-gcc.exe文件的,就不要看网上那些教程了,我这给你们看看我入的坑。

android 编译后怎么知道libs 中的so文件 安卓编译后生成的文件_android_04


首先:

在build.sh中添加如下一行代码,大概意思是想把gcc程序引入进来。位置是在–enable 那几行都可以

--extra-libs=-lgcc \

但是,神他妈不知道啥环境才能生效,我在ubuntu系统中没生效,第一种方法宣告失败。

接着入坑第二种。

export TMPDIR="E:/FFmpeg/jni/temp"

就是引入一个临时文件夹,这个大概是在windows环境下编译才会用到,我加进去之后的确没有报gcc错误,但是神尼玛报错说不能创建该临时文件夹,哪怕我存放的目录是在ubuntu系统中的目录并且我自己创建好了也不行。

最后还是老老实实的将低ffmpeg和ndk的版本吧。

附上一张静态库和动态库都生成的截图,代表我编译成功了,并没有瞎扯(●’◡’●)

android 编译后怎么知道libs 中的so文件 安卓编译后生成的文件_ffmpeg_05

亲测ndk-linux-r14b 与ffmpeg3.3.1 交叉编译成功,大家可以选择这两个版本来玩玩。