一、開發環境
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