首先思路是,在liunx环境下,用ndk交叉编译工具,生产可以在android平台里调用的.so库动态库文件.
因为andriod平台的cpu架构不一致,所有用ndk编译时需要指定目标android平台,我的手机是华为4x,ABI是armv7-a的,查看自己手机的ABI,可以看http://blog.csdn.net/watermusicyes/article/details/45059309,
如果附件无法现在,请复制链接到其他浏览器试试,我这里谷歌可以,火狐不行,
build4android.sh 脚本最好下载到ununtu下编辑,网页上的每行后面会有几个不可见字符,所有不能执行
得到so文件和头文件后,在eclipse,通过jni调用动态库,所以还需要windows的ndk,有的eclipse没有ndk插件这里有链接https://pan.baidu.com/s/1gfeZaev
可以先看这篇视频热热身https://v.qq.com/x/page/s03208w5ewp.html
1.安装VMware Workstation Pro
2.安装ubuntu-16.04.3-desktop-amd64.iso
3.创建root用户,之后再root用户下操作比较好,创建root用户可看下面链接
4.在ubuntu上安装ssh服务,之后传文件方便,
1)ubuntu安装ssh服务器
sudo apt-get install openssh-server
2)出现问题时,重启ssh服务即可
sudo service ssh restart
启动完成之后可以使用命令:ps –e | grep ssh 来查看ssh状态、
5.用Xshell 登录root用户时被拒绝,可以看下面链接
ssh用root登录时被拒绝的解决方法 最后记得重启
6.安装ndk
用Xftp 把 android-ndk-r13-linux-x86_64.zip 上传到ubuntu上,最好上传到系统目录下,我的是/usr/dev/ndk,不要上传到/home下
然后解压zip文件
解压
unzip android-ndk-r13-linux-x86_64.zip
解压后目录是这样的
7.配置ndk环境变量,看参考一下
8.选择ffmpeg版本,最新版本会编译移植失败,比如下面链接中的第二个问题,不知道怎么解决
当我使用3.1.3进行移植时,编译通过了,下面给出下载地址
https://github.com/FFmpeg/FFmpeg/releases/tag/n3.1.3
下载完成后,上传到ubuntu中,我的路径是 /usr/dev/ffmpeg/ffmpeg3.1.3,上传完成后,可以解压到相同目录
解压命令
tar zxvf FFmpeg-n3.1.3.tar.gz
解压完成后,目录是这样的
并且需要修改ffmpeg根目录的configure文件
在虚拟机中按ctrl+alt+T ,打开终端,
然后cd 进入ffmpeg根目录,
用gedit 编辑configure文件
gedit 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)'
9.编写编译脚本
脚本不能在windows中编写上传到ubuntu中执行,可能是因为有不可见字符,我会把我的脚本上传,下载后不要在windows中打开,上传到ubuntu中编辑
下载脚本
https://pan.baidu.com/s/1c1KM3TY
脚本内容
#!/bin/bash
export TMPDIR=/usr/dev/ffmpeg/ffmpeg3.1.3New/FFmpeg-n3.1.3/ffmpegtemp #这句很重要,不然会报错 unable to create temporary file in
# NDK的路径,根据自己的安装位置进行设置
NDK=/usr/dev/ndk/android-ndk-r13
# 编译针对的平台,可以根据自己的需求进行设置
# 这里选择最低支持android-14, arm架构,生成的so库是放在
# libs/armeabi文件夹下的,若针对x86架构,要选择arch-x86
PLATFORM=$NDK/platforms/android-14/arch-arm
# 工具链的路径,根据编译的平台不同而不同
# arm-linux-androideabi-4.9与上面设置的PLATFORM对应,4.9为工具的版本号,
# 根据自己安装的NDK版本来确定,一般使用最新的版本
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--target-os=linux \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--arch=arm \
--sysroot=$PLATFORM \
--extra-cflags="-I$PLATFORM/usr/include" \
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
--enable-shared \
--enable-runtime-cpudetect \
--enable-gpl \
--enable-small \
--enable-cross-compile \
--disable-debug \
--disable-static \
--disable-doc \
--disable-asm \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-postproc \
--disable-avdevice \
--disable-symver \
--disable-stripping \
$ADDITIONAL_CONFIGURE_FLAG
sed -i '' 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h
sed -i '' 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h
sed -i '' 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h
sed -i '' 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h
sed -i '' 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h
sed -i '' 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h
sed -i '' 's/HAVE_CBRT 0/HAVE_CBRT 1/g' config.h
sed -i '' 's/HAVE_RINT 0/HAVE_RINT 1/g' config.h
make clean
make -j4
make install
}
# arm v7vfp
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
PREFIX=./android/$CPU-vfp
ADDITIONAL_CONFIGURE_FLAG=
build_one
# CPU=armv
# PREFIX=$(pwd)/android/$CPU
# ADDI_CFLAGS="-marm"
# build_one
#arm v6
#CPU=armv6
#OPTIMIZE_CFLAGS="-marm -march=$CPU"
#PREFIX=./android/$CPU
#ADDITIONAL_CONFIGURE_FLAG=
#build_one
#arm v7vfpv3
# CPU=armv7-a
# OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
# PREFIX=./android/$CPU
# ADDITIONAL_CONFIGURE_FLAG=
# build_one
#arm v7n
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"
#PREFIX=./android/$CPU
#ADDITIONAL_CONFIGURE_FLAG=--enable-neon
#build_one
#arm v6+vfp
#CPU=armv6
#OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
#PREFIX=./android/${CPU}_vfp
#ADDITIONAL_CONFIGURE_FLAG=
#build_one
其中configure命令的各种参数,可以在下面链接中查得
给脚本可执行权限,要用cd命令进入脚本所在路径
chmod 777 build4android.sh
10.0安装 yasm ,移植中需要,也可以通过禁用命令不使用yasm,但是安装也很方便,就按了吧
sudo apt-get install build-essential git pkg-config yasm
10.1可能还需要安装ubuntu的32位支持库,我是按这里安装的
http://blog.csdn.net/bfboys/article/details/53013662
11.先在ffmpeg根目录下执行
./configure
如果没有问题,在执行刚才编写的脚本
./build4android.sh
如果没有问题,经过10多分钟的编译,
会在ffmpeg根目录下生成android/arm的文件夹
其中include是头文件,lib中是.so库文件
这次编译的结果我也上传到百度云盘了,亲们可以下载测试
https://pan.baidu.com/s/1eS2HFiE
12.在头文件和库文件复制到android工程中.就可以通过jni调用了,测试这次编译成果在下次在分享吧