移植帶X264庫的FFMPEG到ANDROID(win7上,用MINGW)

編譯FFMPEG到ANDROID,可以有兩種選擇,一種是在UBUNTU上,另外一種是在WINDOWS上用MINGW或者CYGWIN編譯,UBUNTU上的編譯過程比較簡單,CYCWIN可以參考http://www.apkbus.com/android-4516-1-1.html,由於本人一直喜歡用MINGW,所以CYCWIN這裏就不多說了,主要介紹WIN7上MINGW的編譯方式。

1:基本的環境下載和安裝,JDK,ANDROID-SDK,ANDROID-NDK和MINGW等,NDK下載R8B版本就可以了。

2:下載FFMPEG和X264,FFMPEG的版本下載0.10.*和0.11.*都可以,x264下載最新版本就可以了。

3:在android-ndk-r8b的samples目錄下,創建一個文件夾,如FFMPEG-TEST,把FFMPEG和X264的源代碼拷貝到該文件夾下。

4:在samples目錄下添加Android.mk和Application.mk文件


這兩個文件和UBUNTU下的一樣。


5:先編譯X264,在X264目錄下創建config.sh文件,把下面添進去

export ARM_ROOT=/E/code/xx/forwindows/android-ndk-r8b
export PLATFORM=$ARM_ROOT/platforms/android-8/arch-arm
export ARM_INC=$PLATFORM/usr/include
export ARM_LIB=$PLATFORM/usr/lib
#export ARM_TOOL=$ARM_ROOT/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86
#export ARM_LIBO=$ARM_TOOL/lib/gcc/arm-eabi/4.4.0
export ARM_TOOL=$ARM_ROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86
export ARM_LIBO=$ARM_TOOL/lib/gcc/arm-linux-androideabi/4.6.x-google
export PATH=$ARM_TOOL/bin:$PATH
export ARM_PRE=arm-linux-androideabi


./configure --prefix=/home/arm_lib \
        --disable-gpac \
        --enable-static \
--enable-pic \
--cross-prefix=$ARM_ROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/${ARM_PRE}- --host=arm-linux \
        --extra-cflags=" -I$ARM_INC -fPIC -DANDROID -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -Wno-psabi -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -DANDROID  -Wa,--noexecstack -MMD -MP -I/E/code/thread/pthreads-w32-2-9-1-release" \
        --extra-ldflags="-nostdlib -Bdynamic  -Wl,--no-undefined -Wl,-z,noexecstack  -Wl,-z,nocopyreloc -Wl,-soname,/system/lib/libz.so -Wl,-rpath-link=$ARM_LIB,-dynamic-linker=/system/bin/linker -L$ARM_LIB -L/E/code/xx/forwindows/android-ndk-r8b/platforms/android-8/arch-arm/usr/lib -llog -nostdlib $ARM_LIB/crtbegin_dynamic.o $ARM_LIB/crtend_android.o -lc -lm -ldl -lgcc " 
        
        #--cross-prefix=/usr/watermark/android-ndk-r5b/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin/${ARM_PRE}- --host=arm-linux

上面這個是針對本人機子上的環境,具體根據自己的情況進行調整

6:啓動MINGW,CD到X264目錄下,config.sh && make -j4

7:在libffmpeg目錄下創建android.mk文件,可以先參考上面鏈接的MK文件的CODE方式,但這樣做的話,由於鏈接的文件太多,會出現FILE NUMBER的錯誤,需要把LIBFFMPEG.SO分成多個小的STATCI來編譯,最後才鏈接成一個大的SO文件,關鍵的修改方法如下

#第一個模塊

LOCAL_SRC_FILES := $(AVUTIL_SRC_FILES) 

ifeq ($(ARCH_ARM),yes)
LOCAL_ARM_MODE := arm
LOCAL_SRC_FILES += $(AVCODEC_ARM_SRC_FILES)
LOCAL_ARM_NEON := true
TARGET_ARCH_ABI := armeabi-v7a
LOCAL_CFLAGS += -march=armv7-a
LOCAL_MODULE := libffmpeg_avutil
endif
include $(BUILD_STATIC_LIBRARY)  現編成靜態的


include $(CLEAR_VARS) #第二個模塊
include $(LOCAL_PATH)/config.mak
LOCAL_PRELINK_MODULE:= false
LOCAL_MODULE_TAGS := optional
LOCAL_CFLAGS += $(ASFLAGS)
LOCAL_CFLAGS += -std=c99
LOCAL_LDLIBS := -llog
LOCAL_C_INCLUDES+=$(LOCAL_PATH)/../x264/include
#LOCAL_STATIC_LIBRARIES := libx264
LOCAL_LDFLAGS+=$(LOCAL_PATH)/../x264/libx264.a
LOCAL_SRC_FILES := $(AVCODEC_SRC_FILES)
#ifeq ($(ARCH_ARM),yes)
#ifeq ($(HAVE_NEON),yes)
LOCAL_ARM_NEON := true
TARGET_ARCH_ABI := armeabi-v7a
LOCAL_CFLAGS += -march=armv7-a
LOCAL_MODULE := libffmpeg_codec
#else
#LOCAL_MODULE := libffmpeg_vfp
#endif
#endif
include $(BUILD_STATIC_LIBRARY)

。。。。。。。。。。。。。


LOCAL_WHOLE_STATIC_LIBRARIES := libffmpeg_avutil libffmpeg_codec libffmpeg_format  #只能用LOCAL_WHOLE_STATIC_LIBRARIES

include $(BUILD_SHARED_LIBRARY)


8:開始編譯,CD到FFMPEG-TEST目錄下,$NDK/ndk-build後,在obj\local\armeabi目錄下生成了libffmpeg.so文件



9:用JNI調用你的libffmpeg.so 文件吧

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