over 7 years ago

1. Download NDK


2. Download ffmpeg source code


3. Modify configure file


  • 開啓 $NDK/sources/ffmpeg/configure,找到下列內容

    SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
    LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
    SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
    
  • 原本的組態內容會將編譯出的檔案,在附檔名後再加上版本資訊(e.g. libavcodec.a.55),Android 系統並不支援這種格式,所以我們用下列內容替代。

    SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
    LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
    SLIB_INSTALL_LINKS='$(SLIBNAME)'
    

4.Build ffmpeg


  • 新增 $NDK/sources/ffmpeg/build_android.sh,輸入以下內容。

    #!/bin/bash
    NDK=$HOME/Desktop/adt/android-ndk-r9
    SYSROOT=$NDK/platforms/android-9/arch-arm/
    TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
    function build_one
    {
    ./configure \
        --prefix=$PREFIX \
        --disable-shared \
        --enable-static \
        --disable-doc \
        --disable-ffmpeg \
        --disable-ffplay \
        --disable-ffprobe \
        --disable-ffserver \
        --disable-avdevice \
        --disable-doc \
        --disable-symver \
        --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
        --target-os=linux \
        --arch=arm \
        --enable-cross-compile \
        --sysroot=$SYSROOT \
        --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
        --extra-ldflags="$ADDI_LDFLAGS" \
        $ADDITIONAL_CONFIGURE_FLAG
    make clean
    make
    make install
    }
    CPU=arm
    PREFIX=$(pwd)/android/$CPU 
    ADDI_CFLAGS="-marm"
    build_one
    
  • 我們取消了shared object,打開 static library,編譯出的檔案會是 .a 檔,這邊的設定可依需求自行調整。

  • 修改 build_android.sh 檔案屬性

    sudo chmod +x build_android.sh
    
  • 執行

    ./build_android.sh
    

    編譯成功後,檔案會放在 $NDK/sources/ffmpeg/android/arm。

6. Use ffmpeg in Android project


  • 在 project 目錄下,新增 jni 目錄。

  • 複製 header files。將 $NDK/sources/ffmpeg/android/arm/include 資料夾複製到 $project/jni/。

  • 複製 library(.a files)。將 $NDK/sources/ffmpeg/android/arm/lib 目錄下的所有 .a 檔,複製到 $project/jni/。

  • 新增 $project/jni/android.mk,並輸入以下內容。

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := mytest
    LOCAL_SRC_FILES := mytest.c
    
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
    LOCAL_LDLIBS := -L$(NDK_PLATFORMS_ROOT)/$(TARGET_PLATFORM)/arch-arm/usr/lib -L$(LOCAL_PATH) -lavformat -lavcodec -lavfilter -lswresample -lavutil -lswscale -llog -ljnigraphics -lz -ldl -lgcc
    
    include $(BUILD_SHARED_LIBRARY)
    

7. Build


  • 開啓 terminal

  • cd 到 project 根目錄下,目錄下應該要有 jni 子目錄。

  • build

    ndk-build clean
    ndk-build
    
← [MySQL] 錯誤整理 Import Git Project to Eclipse →
 
comments powered by Disqus