二、验证ffmpeg ndk编译出来的so可行的简单例子

来源:互联网 发布:windows 照片管理软件 编辑:程序博客网 时间:2024/05/22 12:31

1.ffmpeg的编译请参考 一、ffmpeg编译成android使用的so库

2.在ndk路径下创建一个文件夹,如 ffmpegTest ,在ffmpegTest目录下再创建一个jni目录,此时目录结构如下:

lx@ubt:~/android-ndk-r13b/ffmpegTest$ lsjni
3.将之前ffmpeg编译出来的include和lib目录拷至上面创建好的jni目录中:
lx@ubt:~/android-ndk-r13b/ffmpegTest/jni$ lsinclude  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 __cplusplusextern "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    := avcodecLOCAL_SRC_FILES := lib/libavcodec-57.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE    := avdeviceLOCAL_SRC_FILES := lib/libavdevice-57.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE    := avfilterLOCAL_SRC_FILES := lib/libavfilter-6.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE    := avformatLOCAL_SRC_FILES := lib/libavformat-57.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE    := avutilLOCAL_SRC_FILES := lib/libavutil-55.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE    := postprocLOCAL_SRC_FILES := lib/libpostproc-54.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE    := swresampleLOCAL_SRC_FILES := lib/libswresample-2.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE    := swscaleLOCAL_SRC_FILES := lib/libswscale-4.soinclude $(PREBUILT_SHARED_LIBRARY)#endinclude $(CLEAR_VARS)#编译生成的模块名 --> libFFmpeg-jni.soLOCAL_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 soLOCAL_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$ lslibavcodec-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

0 0
原创粉丝点击