Mac OS下为Android Studio编译FFmpeg解码库的详细教程
NDK部分
1、下载ndk
这里就一笔带过了。
2、解压ndk
不要解压,文件权限会出错。执行之,会自动解压,然后mv到想放的地方。我放到了”/usr/local/bin/android-ndk-r10d”(此目录之后用$NDK_DIR指代)。
3、下载Ffmpeg
我下的是2.5.3版本。
4、解压Ffmpeg
解压Ffmpeg到$NDK_DIR/sources/ffmpeg-2.5.3。
5、修改Ffmpeg编译配置
在ffmpeg-2.5.3目录下把configure文件中的这几行,目的是去掉默认生成的库名字libavcodec.so.55最后那个”55″的版本号。
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)'
6、编译Ffmpeg
在ffmpeg-2.5.3目录下创建文件build_android.sh。
注意前三行要按照自己的路径正确配置。
#!/bin/bash NDK=/usr/local/android-ndk-r10d SYSROOT=$NDK/platforms/android-15/arch-arm/ TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 functionbuild_one { ./configure\ --prefix=$PREFIX\ --enable-shared\ --disable-static\ --disable-doc\ --disable-ffmpeg\ --disable-ffplay\ --disable-ffprobe\ --disable-ffserver\ --disable-avdevice\ --disable-doc\ --disable-symver\ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi-\ --target-os=linux\ --arch=arm\ --enable-cross-compile\ --sysroot=$SYSROOT\ --extra-cflags="-Os-fpic$ADDI_CFLAGS"\ --extra-ldflags="$ADDI_LDFLAGS"\ $ADDITIONAL_CONFIGURE_FLAG makeclean make makeinstall } CPU=arm PREFIX=$(pwd)/android/$CPU ADDI_CFLAGS="-marm" build_one
保存后执行
sudochmod+xbuild_android.sh ./build_android.sh
编译会花上一段时间。
7、查看编译结果
编译完成后$NDK_DIR/sources/ffmpeg-2.5.3下面会多出一个android目录,里面就是我们想要的编译好的库。
[cg@local]#ls-Randroid/
arm android//arm: Android.mkincludelib android//arm/include: libavcodeclibavfilterlibavformatlibavutillibswresamplelibswscale android//arm/include/libavcodec: avcodec.havfft.hdv_profile.hdxva2.hold_codec_ids.hvaapi.hvda.hvdpau.hversion.hvorbis_parser.hxvmc.h android//arm/include/libavfilter: asrc_abuffer.havcodec.havfilter.havfiltergraph.hbuffersink.hbuffersrc.hversion.h android//arm/include/libavformat: avformat.havio.hversion.h android//arm/include/libavutil: adler32.havstring.hcast5.hdownmix_info.hhash.hmacros.hopt.hreplaygain.htime.h aes.havutil.hchannel_layout.herror.hhmac.hmathematics.hparseutils.hripemd.htimecode.h attributes.hbase64.hcommon.heval.himgutils.hmd5.hpixdesc.hsamplefmt.htimestamp.h audio_fifo.hblowfish.hcpu.hffversion.hintfloat.hmem.hpixelutils.hsha.hversion.h audioconvert.hbprint.hcrc.hfifo.hintreadwrite.hmotion_vector.hpixfmt.hsha512.hxtea.h avassert.hbswap.hdict.hfile.hlfg.hmurmur3.hrandom_seed.hstereo3d.h avconfig.hbuffer.hdisplay.hframe.hlog.hold_pix_fmts.hrational.hthreadmessage.h android//arm/include/libswresample: swresample.hversion.h android//arm/include/libswscale: swscale.hversion.h android//arm/lib: libavcodec-56.solibavfilter-5.solibavformat-56.solibavutil-54.solibswresample-1.solibswscale-3.sopkgconfig libavcodec.solibavfilter.solibavformat.solibavutil.solibswresample.solibswscale.so android//arm/lib/pkgconfig: libavcodec.pclibavfilter.pclibavformat.pclibavutil.pclibswresample.pclibswscale.pc其中libavcodec.so、libavfilter.so、libavformat.so、libavutil.so、libswresample.so、libswscale.so都是软链,没有用,可以删掉。
8、给Ffmpeg库写Android.mk使其可用
创建$NDK_DIR/sources/ffmpeg-2.5.3/android/arm/Android.mk文件,内容如下:
要注意其中.so前面的数字应该改成你的ffmpeg版本编译出来的数字。
LOCAL_PATH:=$(callmy-dir) include$(CLEAR_VARS) LOCAL_MODULE:=libavcodec LOCAL_SRC_FILES:=lib/libavcodec-56.so LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)/include include$(PREBUILT_SHARED_LIBRARY) include$(CLEAR_VARS) LOCAL_MODULE:=libavformat LOCAL_SRC_FILES:=lib/libavformat-56.so LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)/include include$(PREBUILT_SHARED_LIBRARY) include$(CLEAR_VARS) LOCAL_MODULE:=libswscale LOCAL_SRC_FILES:=lib/libswscale-3.so LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)/include include$(PREBUILT_SHARED_LIBRARY) include$(CLEAR_VARS) LOCAL_MODULE:=libavutil LOCAL_SRC_FILES:=lib/libavutil-54.so LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)/include include$(PREBUILT_SHARED_LIBRARY) include$(CLEAR_VARS) LOCAL_MODULE:=libavfilter LOCAL_SRC_FILES:=lib/libavfilter-5.so LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)/include include$(PREBUILT_SHARED_LIBRARY) include$(CLEAR_VARS) LOCAL_MODULE:=libswresample LOCAL_SRC_FILES:=lib/libswresample-1.so LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)/include include$(PREBUILT_SHARED_LIBRARY)
至此ndk配置完毕,后面是配置AndroidStudio的部分。
AndroidStudio部分
AndroidStudio和Eclipse不太一样,它有一定的自动生成Android.mk并自动搞定JNI的能力。
但目前还并不足以让我们使用起来Ffmpeg库。
因此我们的思路是禁用掉AndroidStudio自动ndk-build的功能,手动编译我们的C代码达到目的。
首先当然要新建一个AndroidStudio项目。
我们使用$ROOT_DIR指代项目根目录。
1、AndroidStudio配置ndk路径
$ROOT_DIR/local.properties原先只配置了sdk。
sdk.dir=/usr/local/bin/android-sdk-macosx
给它增加一行ndk的配置
sdk.dir=/usr/local/bin/android-sdk-macosx ndk.dir=/usr/local/bin/android-ndk-r10d
2、配置build.gradle
项目里面有两个build.gradle,一个在根目录下,一个在$ROOT_DIR/app/src下,我们要修改的是后者。
A>添加这一段以禁用自动ndk-build。
sourceSets.main.jni.srcDirs=[]
B>添加这一段让它知道用库
ndk{ abiFilter"armeabi" moduleName"ovsplayer" ldLibs"log","z","m","jnigraphics","android" }
修改后的build.gradle是这样的。
android{ compileSdkVersion21 buildToolsVersion"21.1.1" sourceSets.main.jni.srcDirs=[]//禁用自动执行ndk-build defaultConfig{ applicationId"com.example.chengang.myapplication" minSdkVersion15 targetSdkVersion21 versionCode1 versionName"1.0" ndk{ abiFilter"armeabi" moduleName"ovsplayer"//这个是C文件的名字 ldLibs"log","z","m","jnigraphics","android" } } buildTypes{ release{ minifyEnabledfalse proguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro' } } }
3、生成头文件
执行命令,注意路径要根据自己的情况更改。
javah-djni-classpath..\..\build\intermediates\classes\debugcom.example.nativeapp.app.MainActivity