我的环境:CentOS7,AndroidNDK-r20b,FFmpeg-4.1,XShell6,Xftp6
以上资源可以从官网下载,然后传到CentOS下,也可以直接在CentOS下下载。XShell和Xftp自行安装,关联CentOS
1.FFmpeg下载
FFmpeg官网地址,可以单独下载后再通过Xftp上传到CentOS的一个目录,解压。
或者CentOS上直接下载,如下:
#下载
wget http://www.ffmpeg.org/releases/ffmpeg-4.1.tar.gz
#解压
tar -zxvf ffmpeg-4.1.tar.gz
#进入解压后的目录
cd ffmpeg-4.1
#准备
./configure
make
make install
2.配置Android NDK
第一种方法
2.1 先将Android NDK压缩包下载下来
2.2 将压缩包通过Xftp上传到CentOS的一个目录下(我这里是在/usr下新建了一个ffmpeg的目录)
2.3 解压NKD
yum -y install unzip 你的NDK.zip
2.4 配置NDK的环境变量
#进入目录
cd /etc/profile
#编辑
vim profile
#在profile最后添加以下代码
export ANDROID_NDK=/usr/local/ndk/android-ndk-r20b
export PATH=$ANDROIDNDK:$PATH
2.5 刷新配置
在终端输入以下命令:
source profile
2.6 验证NDK是否配置好
在终端输入以下命令
ndk-build -v
第二种方法
1.下载NDK
2.将NDK压缩包上传到CentOS的一个目录
3.解压NDK压缩包
4.配置环境
终端运行:gedit ~/.bashrc
将下面的语句加入
#NDK setting
NDK_ROOT=/usr/ffmpeg/android-ndk-r20b
export NDK_ROOT
保存,终端运行:source ~/.bashrc
使之立即生效。
在终端运行:echo $NDK_ROOT
若正确打印了NDK的路径,说明环境变量修改成功。
测试是否安装成功:
cd 进入android-ndk-r8b/samples/hello-jni,然后在终端运行ndk的编译脚本:
ndk-build -v
如果出现以下版本信息,说明安装成功:
[root@localhost ffmpeg-4.1]# ndk-build -v
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for x86_64-pc-linux-gnu
解压后的FFmpeg:
image.png1.准备
其中我们需要将configure文件的一段代码修改如下:
由:
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)'
configure的文件链接
提取码:topp
编写build_android.sh脚本,执行这个脚本会编译出我们需要的FFmpeg的动态库
shell脚本示例内容如下:
#!/bin/bash
NDK=/home/junt/Documents/android-ndk-r20
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/
#这里修改的是最低支持的android sdk版本(r20版本ndk中armv8a、x86_64最低支持21,armv7a、x86最低支持16)
API=29
function build_android
{
#相当于Android中Log.i
echo "Compiling FFmpeg for $CPU"
#调用同级目录下的configure文件
./configure \
#指定输出目录
--prefix=$PREFIX \
#各种配置项,想详细了解的可以打开configure文件找到Help options:查看
--disable-neon \
--disable-hwaccels \
--disable-gpl \
--disable-postproc \
#配置跨平台编译,同时需要disable-static
--enable-shared \
--enable-jni \
--disable-mediacodec \
--disable-decoder=h264_mediacodec \
#配置跨平台编译,同时需enable-shared
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
#关键点1.指定交叉编译工具目录
--cross-prefix=$CROSS_PREFIX \
#关键点2.指定目标平台为android
--target-os=android \
#关键点3.指定cpu类型
--arch=$ARCH \
#关键点4.指定cpu架构
--cpu=$CPU \
#超级关键点5.指定c语言编译器
--cc=$CC
--cxx=$CXX
#关键点6.开启交叉编译
--enable-cross-compile \
#超级关键7.配置编译环境c语言的头文件环境
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}
#armv8-a
ARCH=arm64
CPU=armv8-a
#r20版本的ndk中所有的编译器都在/android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/目录下(clang)
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
#头文件环境用的不是/android-ndk-r20/sysroot,而是编译器//android-ndk-r20/toolchains/llvm/prebuilt/linux-x86_64/sysroot
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
#交叉编译工具目录,对应关系如下(不明白的可以看下图)
# armv8a -> arm64 -> aarch64-linux-android-
# armv7a -> arm -> arm-linux-androideabi-
# x86 -> x86 -> i686-linux-android-
# x86_64 -> x86_64 -> x86_64-linux-android-
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
#输出目录
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
#方法调用
build_android
脚本下载
提取码:zi2t
将build_android.sh脚本上传到FFmpeg-4.1的文件夹下,上传完毕后再终端窗口最好执行下这个命令 dos2unix build_android.sh
如果没有dos2unix,请安装:
[root@localhost user]# yum install dos2unix
2.修改权限
在终端依次执行命令:
chmod 775 configure
./configure
执行完毕后会生成configure的头文件
3.编译脚本
在终端依次执行以下命令:
chmod +x build_android.sh
./build_android.sh
这时候就会编译,等待编译完成,时间大概20分钟左右。编译完成后,在ffmpeg-4.1的目录下会生成android文件夹,这下面就是相应平台的so库:
image.png
image.png
image.png
至此,编译结束。然后你就可以编写你的JNI代码来调用这些库的功能了。
网友评论