美文网首页
Android-FFMPEG(v4.3) MacOSX下使用ND

Android-FFMPEG(v4.3) MacOSX下使用ND

作者: Cosecant | 来源:发表于2021-03-09 17:22 被阅读0次
    1. FFMPEG根目录下,编译脚本如下:
    #!/bin/bash
    
    # ndk路径
    NDK=/Users/XXXX/Library/Android/sdk/ndk/21.1.6352462
    # 编译工具链目录,ndk17版本以上用的是clang,以下是gcc
    TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
    # 版本号
    API=21
    # 交叉编译树的根目录(查找相应头文件和库用)
    SYSROOT="${TOOLCHAIN}/sysroot"
    
    # armv7-a
    OUTPUT_FOLDER="armeabi-v7a"
    ARCH="arm"
    CPU="armv7-a"
    TOOL_CPU_NAME=armv7a
    TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-androideabi"
    OPTIMIZE_CFLAGS="-march=$CPU"
    
    # arm64-v8a,这个指令集最低支持api21
    # OUTPUT_FOLDER="arm64-v8a"
    # ARCH="aarch64"
    # CPU="armv8-a"
    # TOOL_CPU_NAME=aarch64
    # TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
    # OPTIMIZE_CFLAGS="-march=$CPU"
    
    # x86
    # OUTPUT_FOLDER="x86"
    # ARCH="x86"
    # CPU="x86"
    # TOOL_CPU_NAME="i686"
    # TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
    # OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
    
    # x86_64,这个指令集最低支持api21
    # OUTPUT_FOLDER="x86_64"
    # ARCH="x86_64"
    # CPU="x86_64"
    # TOOL_CPU_NAME="x86_64"
    # TOOL_PREFIX="$TOOLCHAIN/bin/${TOOL_CPU_NAME}-linux-android"
    # OPTIMIZE_CFLAGS="-march=$CPU"
    
    # 输出目录
    PREFIX="${PWD}/android-build/$OUTPUT_FOLDER"
    # so的输出目录, --libdir=$LIB_DIR 可以不用指定,默认会生成在$PREFIX/lib目录中
    #LIB_DIR="${PWD}/android/libs/$OUTPUT_FOLDER"
    # 编译器
    CC="${TOOL_PREFIX}${API}-clang"
    CXX="${TOOL_PREFIX}${API}-clang++"
    
    # 定义执行configure的shell方法
    function build_android() {
        ./configure \
            --prefix=$PREFIX \
            --enable-shared \
            --disable-static \
            --enable-jni \
            --disable-doc \
            --disable-programs \
            --disable-symver \
            --target-os=android \
            --arch=$ARCH \
            --cpu=$CPU \
            --cc=$CC \
            --cxx=$CXX \
            --enable-cross-compile \
            --sysroot=$SYSROOT \
            --extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
            --extra-ldflags="" \
            --disable-asm \
            $COMMON_FF_CFG_FLAGS
        make clean
        make -j8
        make install
    }
    
    build_android
    

    修改NDK位置以及OUTPUT位置,执行 sh xxx.sh 进行编译等待完成即可。

    2.复制项目编译出来的so文件到android项目中对应位置 libs/armeabi-v7a 或 libs/arm64-v8a

    3.修改项目app模块build.gradle文件,如下:

    android {
        defaultConfig {
            .... //省略一些内容
            ndk {
                abiFilters 'armeabi-v7a'
            }
            sourceSets {
                main {
                    jniLibs.srcDirs = ['libs']
                }
            }
        }
        externalNativeBuild {
            cmake {
                path "src/main/cpp/CMakeLists.txt"
                version "3.10.2"
            }
        }
    }
    

    4.位于cpp目录下CMakeLists.txt文件的配置,用于链接 ffmpeg库,如下配置:

    # For more information about using CMake with Android Studio, read the
    # documentation: https://d.android.com/studio/projects/add-native-code.html
    
    # Sets the minimum version of CMake required to build the native library.
    
    cmake_minimum_required(VERSION 3.10.2)
    
    # Declares and names the project.
    
    project("jni")
    
    # 配置.h文件的目录,这里是直接放在cpp中的,文件目录名叫includes
    include_directories(includes)
    # 配置so文件的位置目录,项目中放在app/libs下的,应如下设置
    set(LINK_DIR ${CMAKE_SOURCE_DIR}/../../../libs/${CMAKE_ANDROID_ARCH_ABI})
    # 链接响应的so库
    link_directories(${LINK_DIR})
    # 声明全局的SO库的位置信息,方便后面引入该库
    file(GLOB SO_DIR ${LINK_DIR}/*.so)
    
    # Creates and names a library, sets it as either STATIC
    # or SHARED, and provides the relative paths to its source code.
    # You can define multiple libraries, and CMake builds them for you.
    # Gradle automatically packages shared libraries with your APK.
    
    add_library( # Sets the name of the library.
            native-lib
    
            # Sets the library as a shared library.
            SHARED
    
            # Provides a relative path to your source file(s).
            native-lib.cpp)
    
    # Searches for a specified prebuilt library and stores the path as a
    # variable. Because CMake includes system libraries in the search path by
    # default, you only need to specify the name of the public NDK library
    # you want to add. CMake verifies that the library exists before
    # completing its build.
    
    find_library( # Sets the name of the path variable.
            log-lib
    
            # Specifies the name of the NDK library that
            # you want CMake to locate.
            log)
    
    # Specifies libraries CMake should link to your target library. You
    # can link multiple libraries, such as libraries you define in this
    # build script, prebuilt third-party libraries, or system libraries.
    
    target_link_libraries( # Specifies the target library.
            native-lib
            -Wl,--start-group  # 设置库的引入不分先后顺序
            ${SO_DIR}
            -Wl,--end-group
            # Links the target library to the log library
            # included in the NDK.
            ${log-lib}
            z)
    

    相关文章

      网友评论

          本文标题:Android-FFMPEG(v4.3) MacOSX下使用ND

          本文链接:https://www.haomeiwen.com/subject/zajbqltx.html