这篇文章紧接上一篇ffmpeg 集成x264和fdk-aac 库的编译讲解如何使用编译后的库。上一篇的文章的连接:
http://blog.csdn.net/xiaibiancheng/article/details/69703023
1.在eclipse 里面设置ndk 的路径如下图所示:
ndk 的下载路径:
https://dl.google.com/android/repository/android-ndk-r11c-windows-x86_64.zip
下载后解压到指定路径,然后在上面的界面浏览到解压的路径。
注意:解压后再ndk 目录里面新建一个文件,命名为ndk-build,文件内容为空,不然的话进行上面那一步设置ndk路径的时候,eclipse 将无法识别.
2.在eclipse 里面新建一个android 项目,然后点击项目右键,Android tools菜单,选择Add Native support ,这样项目就可以编译ndk 的c/c++代码了。
3.在将fdk-aac、x264和ffmpeg 生成静态库拷贝到jni目录下,结构目录如下图:
4.编写Android.mk和Application.mk文件,内容分别如下:
Android.mk内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=x264
LOCAL_SRC_FILES :=./libx264/libx264.a
include $(PREBUILT_STATIC_LIBRARY)
LOCAL_MODULE :=fdk_aac
LOCAL_SRC_FILES := ./fdk-aac/libfdk-aac.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avutil
ifeq ($(TARGET_ARCH_ABI),armeabi)
LOCAL_SRC_FILES := ./ffmpeg/armv5te/libavutil.a
else
LOCAL_SRC_FILES := ./ffmpeg/armv7-a/libavutil.a
endif
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avcodec
ifeq ($(TARGET_ARCH_ABI),armeabi)
LOCAL_SRC_FILES := ./ffmpeg/armv5te/libavcodec.a
else
LOCAL_SRC_FILES := ./ffmpeg/armv7-a/libavcodec.a
endif
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := avformat
ifeq ($(TARGET_ARCH_ABI),armeabi)
LOCAL_SRC_FILES := ./ffmpeg/armv5te/libavformat.a
else
LOCAL_SRC_FILES := ./ffmpeg/armv7-a/libavformat.a
endif
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_CFLAGS := -D__STDC_CONSTANT_MACROS -Wno-sign-compare -Wno-switch -Wno-pointer-sign -DHAVE_NEON=1 \
-mfpu=neon -mfloat-abi=softfp -fPIC -DANDROID
LOCAL_C_INCLUDES := \
./$(LOCAL_PATH)/ffmpeg/include
LOCAL_SRC_FILES := \
ffmpegexample.c
LOCAL_LDLIBS := -llog -ljnigraphics -lz -ldl -lgcc
LOCAL_STATIC_LIBRARIES := avformat avcodec avutil x264 fdk_aac
LOCAL_MODULE := test
include $(BUILD_SHARED_LIBRARY)
上面只连接了三个ffmpeg 的库,如有其它需要可以仿照上面添加。
Application.mk的内容:
APP_ABI :=armeabi-v7a armeabi
APP_PLATFORM = android-14
5.编写测试代码:
jni代码:
#include <jni.h>
#include<stdio.h>
#include<math.h>
#include <android/log.h>
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libavutil/log.h"
#include "libavutil/mathematics.h"
#define TAG "TEST"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)
void Java_com_example_ffmpeg_MainActivity_test(JNIEnv* env, jobject thiz){
av_register_all();
LOGD("ok");
}
java 代码:
package com.example.ffmpeg;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
static {
System.loadLibrary("test");
}
public static native void test();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
test();
}
});
}
}
编译运行就行就行
测试项目地址:
https://github.com/XIAIBIANCHENG/ffmpegtest