一、开发环境
Ubuntu14.04
FFmpeg-2.5.3
android-ndk-r10d-linux-x86_64
二、编译FFmpeg
1. 解压ffmpeg-2.5.3.tar.bz2之后,修改ffmpeg-2.5.3/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)'
【注】如果不修改配置,直接编译,编译出来的so文件类似libavcodec.so.55.39.101,版本号位于so之后,Android上似乎无法加载。
2. 编写build_android.sh自动配置脚本文件
#!/bin/bash
NDK=/opt/android-ndk-r10d
SYSROOT=$NDK/platforms/android-19/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
./configure \
--target-os=linux \
--arch=arm \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-postproc \
--enable-shared \
--disable-static \
--enable-cross-compile \
--prefix=$(pwd)/prefix \
--sysroot=$SYSROOT \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi-
并增加build_android.sh可执行权限。
3. 开始配置,编译和安装
$./build_android.sh
$make
$make install
prefix/ 为编译生成的库文件
三、创建Jni调用的Android工程
1. 创建一个新的Android工程Jni
2. 在该工程根目录下创建jni文件夹
3. 在jni目录下创建prebuilt目录,并将上面编译好的.so文件和头文件拷贝到该目录
4. 创建包含native方法的类,新建FFmpegNative.java类文件。主要包括加载so库文件和一个native测试方法。
package com.charein.jni;
public class FFmpegNative {
static {
System.loadLibrary("avdevice-56");
System.loadLibrary("avfilter-5");
System.loadLibrary("avutil-54");
System.loadLibrary("swresample-1");
System.loadLibrary("avformat-56");
System.loadLibrary("swscale-3");
System.loadLibrary("avcodec-56");
System.loadLibrary("ffmpeg_codec");
}
public native int avcodec_find_decoder(int codecID);
}
5. 自动生成头文件
进入bin/classes目录,执行下面命令会自动生成头文件
javah --classpath ./ com_charein_jni_FFmpegNative
6. 在jni目录下新建与头文件同名的C/C++源文件,com_charein_jni_FFmpegNative.c内容如下:
#include <stdlib.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include "com_charein_jni_FFmpegNative.h"
JNIEXPORT jint JNICALL Java_com_charein_jni_FFmpegNative_avcodec_1find_1decoder
(JNIEnv *env, jobject obj, jint codecID)
{
AVCodec *codec = NULL;
av_register_all();
codec = avcodec_find_decoder(codecID);
if (codec != NULL)
return 0;
else
return -1;
}
7. 编写Android.mk,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=avcodec-prebuilt
LOCAL_SRC_FILES :=prebuilt/libavcodec-56.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE :=avdevice-prebuilt
LOCAL_SRC_FILES :=prebuilt/libavdevice-56.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE :=avfilter-prebuilt
LOCAL_SRC_FILES :=prebuilt/libavfilter-5.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE :=avformat-prebuilt
LOCAL_SRC_FILES :=prebuilt/libavformat-56.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE :=avutil-prebuilt
LOCAL_SRC_FILES :=prebuilt/libavutil-54.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE :=avswresample-prebuilt
LOCAL_SRC_FILES :=prebuilt/libswresample-1.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE :=swscale-prebuilt
LOCAL_SRC_FILES :=prebuilt/libswscale-3.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE :=ffmpeg_codec
LOCAL_SRC_FILES :=com_charein_jni_FFmpegNative.c
LOCAL_LDLIBS :=-llog -lz -landroid -ljnigraphics # -L$(LOCAL_PATH)/prebuilt
LOCAL_SHARED_LIBRARIES := avcodec-prebuilt avdevice-prebuilt avfilter-prebuilt \
avformat-prebuilt avutil-prebuilt avswresample-prebuilt swscale-prebuilt
include $(BUILD_SHARED_LIBRARY)
8. 在eclipse添加builder
工程右键 Properties -> Builders 新建一个编译器,使用ndk-build.cmd