上一篇文章说到,怎么将ffmepg打包成so库的编译过程,这篇文章将把上一篇文章的so库打包进android studio中,通常情况下只需要直接将so库和头文件直接放在libs下就可以,但是那样比较容易错,本人试过好几次都有头文件找不到的报错,于是直接采用下面的方法:
1将ndk路径添加到环境变量
touch ~/.bash_profile
open ~/.bash_profile
然后在文本内输入ndk的路径,本文是
export PATH=$PATH:/Users/wenxi/Library/Android/sdk/ndk-bundle (也就是SDK默认的下载路径)
然后source ~/.bash_profile使环境变量生效。
2,将编译生成的头文件和libs放入ndk的sources目录,这个目录会在ndk编译的时候被引用,本文采用的路径是
sources/ffmepg/android/arm(这个路径在studio的工程中将会被用到,要记下来)
头文件和lib目录放在arm文件夹里面,在arm文件夹里面新建一个Android.mk文件,
其内容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavcodec
LOCAL_SRC_FILES:= lib/libavcodec-57.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavdevice
LOCAL_SRC_FILES:= lib/libavdevice-57.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavfilter
LOCAL_SRC_FILES:= lib/libavfilter-6.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavformat
LOCAL_SRC_FILES:= lib/libavformat-57.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavutil
LOCAL_SRC_FILES:= lib/libavutil-55.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libpostproc
LOCAL_SRC_FILES:= lib/libpostproc-54.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libswresample
LOCAL_SRC_FILES:= lib/libswresample-2.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libswscale
LOCAL_SRC_FILES:= lib/libswscale-4.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libx264
LOCAL_SRC_FILES:= lib/libx2641.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
大概的意思是将lib下的so重新命名并绑定头文件,这样我们就不用那么麻烦把头文件添加到工程了
3在android studio中创建jni
在工程的main目录下创建jni文件夹,在该文件夹下创建Android.mk文件,内容如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := tutorial01 LOCAL_SRC_FILES := tutorial01.c LOCAL_LDLIBS := -llog -ljnigraphics -lz LOCAL_SHARED_LIBRARIES := libavcodec libavdevice libavfilter libavformat libavutil libpostproc libswresample libswscale libx264 include $(BUILD_SHARED_LIBRARY) $(call import-module,ffmepg/android/arm)
其中,ffmepg/android/arm就是我们刚才记录下来的路径
创建一个Application.mk文件:
APP_ABI := armeabi #APP_ABI := armeabi-v7a APP_PLATFORM := android-24
最后,在android studio下打开终端,sudo一下,cd 到工程的main文件夹,然后执行ndk-build命令看到编译结果
在libs文件夹下看到对应的so就成功了
下面我们来写个hello word牛刀小试下,新建一个工程,里面有一个textview ,
在main activity里面加载所有的so文件库,
static { System.loadLibrary("x2641"); System.loadLibrary("avcodec-57"); System.loadLibrary("avdevice-57"); System.loadLibrary("avfilter-6"); System.loadLibrary("avformat-57"); System.loadLibrary("avutil-55"); System.loadLibrary("postproc-54"); System.loadLibrary("swresample-2"); System.loadLibrary("swscale-4"); System.loadLibrary("hello"); }
创建一个Utilts类,下面定义一个方法
public native String stringFromJNI();
使用java生成.h文件(参考ndk教程的使用,本文不再描述)
创建一个.c文件,
其内容如下,
#include <jni.h> #include <com_example_wenxi_myapplication_Utils.h> #include "libavcodec/avcodec.h" JNIEXPORT jstring JNICALL Java_com_example_wenxi_myapplication_Utils_stringFromJNI (JNIEnv *env, jobject obj) { char info[10000] = { 0 }; sprintf(info, "%s\n", avcodec_configuration()); return (*env)->NewStringUTF(env, info); }该函数用来返回ffmepg的配置信息
我们让它显示在textview上
Utils utils=new Utils(); editText=(TextView)findViewById(R.id.textview); editText.setText(utils.stringFromJNI());
我们需要设置一下NDK的相关配置:
在gradle.properties中添加
android.useDeprecatedNdk=true //该代码启动NDK的相关配置
然后在APP build中添加
sourceSets.main { jni.srcDirs = [] jniLibs.srcDir 'src/main/libs' }
该代码用来配置NDK相关资源的目录,没有这个APP会崩溃
最后,运行如图:
最后,贡献自己的源码:http://download.csdn.net/detail/qq_25817651/9655958