NDK r21編譯FFmpeg 4.2.2(x86、x86_64、armv7、armv8)

1.編譯FFmpeg

準備Ununtu、ndk r21(linux)、FFmpeg。

準備編譯腳本,這裏有兩個,其中一個是專門針對armv7的。

armv7

#!/bin/bash

API=21
#armv7-a
ARCH=armv7 

PREFIX=./SO/$ARCH

TOOLCHAIN=/home/qwe/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64

build()
{
./configure \
--prefix=$PREFIX \
--disable-static \
--enable-shared \
--enable-small \
--enable-gpl \
--disable-doc \
--disable-programs \
--disable-avdevice \
--enable-cross-compile \
--target-os=android \
--arch=$ARCH \
--cc=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- 

make clean
make -j4
make install

}

build

arm64 x86 x86_64

#!/bin/bash

API=21
#arm64  x86 x86_64 對應 aarch64  i686  x86_64 
ARCH=arm64
ARCH2=aarch64    

PREFIX=./SO/$ARCH

TOOLCHAIN=/home/qwe/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64

build()
{
./configure \
--prefix=$PREFIX \
--disable-static \
--enable-shared \
--enable-small \
--disable-doc \
--disable-programs \
--disable-avdevice \
--enable-cross-compile \
--target-os=android \
--arch=$ARCH \
--cc=$TOOLCHAIN/bin/$ARCH2-linux-android$API-clang \
--cross-prefix=$TOOLCHAIN/bin/$ARCH2-linux-android- 

make clean
make -j4
make install

}

build

在FFmpeg的根目錄運行腳本。最初運行會提示缺少軟件,按提示進行安裝就行。

qwe@ubuntu:~/FFmpeg-n4.2.2$ sudo su
[sudo] qwe 的密碼: 
root@ubuntu:/home/qwe/FFmpeg-n4.2.2# ./build3.sh 

在這裏插入圖片描述

2.使用FFmpeg的so庫

android studio創建項目
在這裏插入圖片描述
將so文件複製到如下目錄。include是FFmpeg的.h文件,x86、x86_64、armv7、armv8生成的.h一樣的。
在這裏插入圖片描述
編輯build.gradle(:app)

android {
    .....
    sourceSets {
        main {//jniLibs
            jniLibs.srcDirs = ['src/main/libs']
        }
    }
}

編輯cmakeList.txt

cmake_minimum_required(VERSION 3.4.1)

#設置兩個目錄,${ANDROID_ABI}會根據設備變化
set(DIR ${PROJECT_SOURCE_DIR}/../libs/${ANDROID_ABI})
set(DIR2 ${PROJECT_SOURCE_DIR}/../libs)
#指定h文件的目錄,編譯過程需要找.h文件
include_directories(${DIR2}/include)

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)

#導入FFmpeg的庫
add_library(libavcodec SHARED IMPORTED)
#so文件的位置
set_target_properties(libavcodec
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/libavcodec.so)


add_library(libavfilter SHARED IMPORTED)
set_target_properties(libavfilter
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/libavfilter.so)

add_library(libavformat SHARED IMPORTED)
set_target_properties(libavformat
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/libavformat.so)

add_library(libavutil SHARED IMPORTED)
set_target_properties(libavutil
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/libavutil.so)

add_library(libswresample SHARED IMPORTED)
set_target_properties(libswresample
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/libswresample.so)

add_library(libswscale SHARED IMPORTED)
set_target_properties(libswscale
        PROPERTIES IMPORTED_LOCATION
        ${DIR}/libswscale.so)

find_library( # Sets the name of the path variable.
        log-lib

        log)

#連接庫
target_link_libraries( # Specifies the target library.
        native-lib

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib}
        libavfilter
        libavformat
        libswresample
        libswscale
        libavutil
        libavcodec)

更改native-lib.cpp中的stringFromJNI方法

#include <jni.h>
#include <string>

extern  "C"{
#include "libavcodec/avcodec.h"
}


extern "C" JNIEXPORT jstring JNICALL
Java_cn_study_testffmpeg_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = avcodec_configuration();
    return env->NewStringUTF(hello.c_str());
}

運行效果
在這裏插入圖片描述

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