Mac 下爲將ffmepg +x264移植到android中(2)

上一篇文章說到,怎麼將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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章