1.ffmpeg的编译请参考 一、ffmpeg编译成android使用的so库
2.在ndk路径下创建一个文件夹,如 ffmpegTest ,在ffmpegTest目录下再创建一个jni目录,此时目录结构如下:
lx@ubt:~/android-ndk-r13b/ffmpegTest$ ls
jni
3.将之前ffmpeg编译出来的include和lib目录拷至上面创建好的jni目录中:
lx@ubt:~/android-ndk-r13b/ffmpegTest/jni$ ls
include lib
4.用eclipse创建一个android工程,如FFmpegTest
5.在工程中创建一个类,如 FFmpegJNI.java,并写个native方法
6.终端进入工程目录FFmpegTest/bin/classes/下,执行:
javah -classpath . -jni com.hoperun.ffmpegtest.FFmpegJNI
生成com_hoperun_ffmpegtest_FFmpegJNI.h头文件,内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_hoperun_ffmpegtest_FFmpegJNI */
#ifndef _Included_com_hoperun_ffmpegtest_FFmpegJNI
#define _Included_com_hoperun_ffmpegtest_FFmpegJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_hoperun_ffmpegtest_FFmpegJNI
* Method: avcodecLicense
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_hoperun_ffmpegtest_FFmpegJNI_avcodecLicense
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
7.拷贝该头文件,放到~/android-ndk-r13b/ffmpegTest/jni/目录下
8.在~/android-ndk-r13b/ffmpegTest/jni/目录下创建一个c文件,如com_hoperun_ffmpegtest_FFmpegJNI.c。内容如下:
#include "com_hoperun_ffmpegtest_FFmpegJNI.h"
#include <android/log.h>
#include <libavcodec/avcodec.h>
#define LOG_TAG "FFMPEG"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
/*
* Class: com_hoperun_ffmpegtest_FFmpegJNI
* Method: avcodecLicense
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_hoperun_ffmpegtest_FFmpegJNI_avcodecLicense
(JNIEnv *env, jobject obj) {
LOGD("call Java_com_hoperun_ffmpegtest_FFmpegJNI_avcodecLicense\n");
return (*env)->NewStringUTF(env,avcodec_license());
}
9.在~/android-ndk-r13b/ffmpegTest/jni/目录下创建一个Android.mk内容如下:
LOCAL_PATH := $(call my-dir)
#begin 预编so模块,后面链接进来
include $(CLEAR_VARS)
LOCAL_MODULE := avcodec
LOCAL_SRC_FILES := lib/libavcodec-57.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avdevice
LOCAL_SRC_FILES := lib/libavdevice-57.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avfilter
LOCAL_SRC_FILES := lib/libavfilter-6.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avformat
LOCAL_SRC_FILES := lib/libavformat-57.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avutil
LOCAL_SRC_FILES := lib/libavutil-55.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := postproc
LOCAL_SRC_FILES := lib/libpostproc-54.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := swresample
LOCAL_SRC_FILES := lib/libswresample-2.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := swscale
LOCAL_SRC_FILES := lib/libswscale-4.so
include $(PREBUILT_SHARED_LIBRARY)
#end
include $(CLEAR_VARS)
#编译生成的模块名 --> libFFmpeg-jni.so
LOCAL_MODULE := FFmpeg-jni
#搜索的头文件路径
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
#需要编译的源文件
LOCAL_SRC_FILES := com_hoperun_ffmpegtest_FFmpegJNI.c
#链接ffmpeg so模块
LOCAL_SHARED_LIBRARIES := avcodec avdevice avfilter avformat avutil postproc swresample swscale
#-llog 链接android的log so
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
10.执行如下命令编译:(只生成amreabi-v7a架构的)
lx@ubt:~/android-ndk-r13b/ffmpegTest/jni$ ../../ndk-build APP_ABI="armeabi-v7a"
[armeabi-v7a] Compile thumb : FFmpeg-jni <= com_hoperun_ffmpegtest_FFmpegJNI.c
[armeabi-v7a] Prebuilt : libavcodec-57.so <= jni/lib/
[armeabi-v7a] Prebuilt : libavdevice-57.so <= jni/lib/
[armeabi-v7a] Prebuilt : libavfilter-6.so <= jni/lib/
[armeabi-v7a] Prebuilt : libavformat-57.so <= jni/lib/
[armeabi-v7a] Prebuilt : libavutil-55.so <= jni/lib/
[armeabi-v7a] Prebuilt : libpostproc-54.so <= jni/lib/
[armeabi-v7a] Prebuilt : libswresample-2.so <= jni/lib/
[armeabi-v7a] Prebuilt : libswscale-4.so <= jni/lib/
[armeabi-v7a] SharedLibrary : libFFmpeg-jni.so
[armeabi-v7a] Install : libFFmpeg-jni.so => libs/armeabi-v7a/libFFmpeg-jni.so
[armeabi-v7a] Install : libavcodec-57.so => libs/armeabi-v7a/libavcodec-57.so
[armeabi-v7a] Install : libavdevice-57.so => libs/armeabi-v7a/libavdevice-57.so
[armeabi-v7a] Install : libavfilter-6.so => libs/armeabi-v7a/libavfilter-6.so
[armeabi-v7a] Install : libavformat-57.so => libs/armeabi-v7a/libavformat-57.so
[armeabi-v7a] Install : libavutil-55.so => libs/armeabi-v7a/libavutil-55.so
[armeabi-v7a] Install : libpostproc-54.so => libs/armeabi-v7a/libpostproc-54.so
[armeabi-v7a] Install : libswresample-2.so => libs/armeabi-v7a/libswresample-2.so
[armeabi-v7a] Install : libswscale-4.so => libs/armeabi-v7a/libswscale-4.so
生成的so库都在lx@ubt:~/android-ndk-r13b/ffmpegTest/libs/armeabi-v7a 目录下:
lx@ubt:~/android-ndk-r13b/ffmpegTest/libs/armeabi-v7a$ ls
libavcodec-57.so libavdevice-57.so libavfilter-6.so libavformat-57.so libavutil-55.so libFFmpeg-jni.so libpostproc-54.so libswresample-2.so libswscale-4.so
11.拷贝这些so到eclipse工程下
12.修改FFmpegJNI.java文件:
13.MainActivity内容:
14.编译运行apk:
log输出OK