为什么要写本篇文章
前两篇介绍的不管是多个模块so还是单个的so文件,在添加到自己的项目中,利用Android.mk生成自己的库时,只是生成armeabi-v7a 、armeabi等平台。
目前,市场上大多数的手机的CPU都已经是64位的,这样,编译出来的库在64位的手机上就无法运行。
这就是写本篇文章的目的
1、先贴sh文件
#!/bin/bash
#Change NDK to your Android NDK location
NDK=xxxx/android-ndk-r10e
#64位用的 是 arch
PLATFORM=$NDK/platforms/android-21/arch-arm64/
PREBUILT=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64
GENERAL="\\
--enable-cross-compile \\
--extra-libs="-lgcc" \\
--cc=$PREBUILT/bin/aarch64-linux-android-gcc \\
--cross-prefix=$PREBUILT/bin/aarch64-linux-android- \\
--nm=$PREBUILT/bin/aarch64-linux-android-nm"
MODULES="\\
--disable-avdevice \\
--disable-doc"
function build_arm64
{
./configure \\
--logfile=conflog.txt \\
--target-os=linux \\
--prefix=./android/aarch64 \\
--arch=aarch64 \\
${GENERAL} \\
--sysroot=$PLATFORM \\
--extra-cflags=" -O3 -DANDROID -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -fno-strict-aliasing" \\
--enable-shared \\
--disable-static \\
--enable-jni \\
--enable-mediacodec \\
--extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl -llog" \\
--enable-zlib \\
${MODULES}
make clean
make install
}
build_arm64
这个编译脚本在FFmpeg3.0是可以正常运行的,然而到了3.1.2版本就编译不过了,会出现如下错误:
这个错误的说明在链接compat/strtod.o时,文件格式不对。当时就懵了,为什么啊?在3.0版本就可以过,在3.1.2版怎么就不行了呢?没办法,百度谷歌一下,结果都是说
You should do a "make clean" before building.
然后就看了一下我的脚本,有 make clean啊,怎么还不行?后来在https://trac.ffmpeg.org/ticket/5546 这个网站看的了相关说明:
So after make clean, a bunch of files are not cleaned (as already shown in above comment):
- compat\msvcrt\snprintf.d
- compat\msvcrt\snprintf.o
- compat\strtod.d
- compat\strtod.o
- bunch of pdb and ilk files for ffmpeg_g, ffprobe_g
Removing the first 4 (snprintf.o/d and strod.o/d) fixes the problem, since they'll then be built again for the correct platform.
这说明再执行make clean 的时候,compat包下面的并没有被清除掉(不知道为什么没有被clean掉),所以要手动删除strtod.d、strtod.o两个文件,然后再去执行脚本,这一次运行一切顺利。这样arm64位手机的兼容库就编译完成了。
编译出来的文件,不管是32位还是64位,都只包含的有视频解码库,没有视频编码库。如果仅仅只做视频的解码和播放已经足够了,但如果想做视频的编码就必须要加入视频的编码库。下一篇文章介绍如何加入xh264编码库。
最后,关于本文提到那个问题,如果有哪位大神知道别的更好的解决方法,希望不吝赐教,谢谢!