FFmpeg ndkクロスコンパイルandroidに統合

9514 ワード

1.ソフトウェアバージョン
1.1 ndk  android-ndk-r15c
1.2 ffmepg  ffmpeg-4.0.5.tar.bz2
1.3 x264 x264-stable.tar.gz
 
2.コンパイルx 264静的ライブラリ
 
tar -zxvf x264-stable.tar.gz
 
mv x264-stable x264
vi build.sh
 
#!/bin/bash NDK=/home/sheng/ndk/android-ndk-r15c
configure() {     CPU=$1     PREFIX=$(pwd)/android/$CPU     HOST=""    CROSS_PREFIX=""    SYSROOT=""    if [ "$CPU"== "armv7-a"]     then         HOST=arm-linux         SYSROOT=$NDK/platforms/android-21/arch-arm/        CROSS_PREFIX=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-     else         HOST=aarch64-linux         SYSROOT=$NDK/platforms/android-21/arch-arm64/        CROSS_PREFIX=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-     fi     ./configure\        --prefix=$PREFIX\        --host=$HOST\        --enable-pic\        --enable-static\        --enable-neon\        --extra-cflags="-fPIE -pie"\        --extra-ldflags="-fPIE -pie"\        --cross-prefix=$CROSS_PREFIX\        --sysroot=$SYSROOT }
build() {     make clean     cpu=$1     echo "build $cpu"
    configure $cpu     #-j     make -j4     make install }
build arm64 build armv7-a
 
sudo chmod 777 build.sh
./build.sh
3.ffmpeg静的ライブラリのコンパイル
tar -jxvf ffmpeg-4.0.5.tar.bz2
cp ../x264 ffmpeg-4.0.5/x264
vi build.sh
 
#!/bin/bash NDK=/home/sheng/ndk/android-ndk-r15c ADDI_CFLAGS="-fPIE -pie"ADDI_LDFLAGS="-fPIE -pie"
configure() {     CPU=$1     PREFIX=$(pwd)/android/$CPU     x264=$(pwd)/x264/android/$CPU     HOST=""    CROSS_PREFIX=""    SYSROOT=""    ARCH=""    if [ "$CPU"== "armv7-a"]     then         ARCH="arm"        HOST=arm-linux         SYSROOT=$NDK/platforms/android-21/arch-arm/        CROSS_PREFIX=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-     else         ARCH="aarch64"        HOST=aarch64-linux         SYSROOT=$NDK/platforms/android-21/arch-arm64/        CROSS_PREFIX=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-     fi     ./configure\        --prefix=$PREFIX\        --enable-small\        --disable-programs\        --disable-encoders\        --disable-muxers\        --disable-filters\        --disable-decoders\        --disable-avdevice\        --disable-doc\        --disable-ffplay\        --disable-network\        --disable-doc\        --disable-symver\        --enable-neon\        --enable-libx264\        --enable-gpl\        --enable-pic\        --enable-jni\        --enable-pthreads\        --enable-mediacodec\        --enable-encoder=aac\        --enable-encoder=gif\        --enable-encoder=libopenjpeg\        --enable-encoder=libmp3lame\        --enable-encoder=libwavpack\        --enable-encoder=libx264\        --enable-encoder=mpeg4\        --enable-encoder=pcm_s16le\        --enable-encoder=png\        --enable-encoder=srt\        --enable-encoder=subrip\        --enable-encoder=yuv4\        --enable-encoder=text\        --enable-decoder=aac\        --enable-decoder=aac_latm\        --enable-decoder=libopenjpeg\        --enable-decoder=mp3\        --enable-decoder=mpeg4_mediacodec\        --enable-decoder=pcm_s16le\        --enable-decoder=flac\        --enable-decoder=flv\        --enable-decoder=gif\        --enable-decoder=png\        --enable-decoder=srt\        --enable-decoder=xsub\        --enable-decoder=yuv4\        --enable-decoder=vp8_mediacodec\        --enable-decoder=h264_mediacodec\        --enable-decoder=hevc_mediacodec\        --enable-hwaccel=h264_mediacodec\        --enable-hwaccel=mpeg4_mediacodec\        --enable-ffmpeg\        --enable-bsf=aac_adtstoasc\        --enable-bsf=h264_mp4toannexb\        --enable-bsf=hevc_mp4toannexb\        --enable-bsf=mpeg4_unpack_bframes\        --enable-cross-compile\        --cross-prefix=$CROSS_PREFIX\        --disable-shared\        --enable-static\        --target-os=android\        --arch=$ARCH\        --sysroot=$SYSROOT\        --extra-cflags="-I$x264/include $ADDI_CFLAGS"\        --extra-ldflags="-L$x264/lib"}
build() {     make clean     cpu=$1     echo "build $cpu"
    configure $cpu     make -j4     make install }
build arm64 build armv7-a
 
sudo chmod 777 build.sh
./build.sh
4.Windowsで現在のディレクトリを開いてandroid studioプロジェクトにコピーする
explorer.exe .
4.1コピーffmpeg include
/ffmpeg-4.0.5/android/arm64/include
\app\src\main\cpp\include
 
4.2コピーffmpeg a
/ffmpeg-4.0.5/android/arm64/lib
\app\src\main\cpp\libs
4.3 appのbuildを修正する.gradle
externalNativeBuild {
    cmake {
        cppFlags "-std=c++11"
        abiFilters "armeabi-v7a" , "arm64-v8a"
    }
}

4.5 appのCMakeListsを修正する.txt
cmake_minimum_required(VERSION 3.4.1)

include_directories(${CMAKE_SOURCE_DIR}/include)


add_library(
        native-lib
        SHARED
        native-lib.cpp)

add_library(static-lib
        STATIC
        IMPORTED
        )
set_target_properties(static-lib
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libstatic-lib.a )

#add libavcodec
add_library(libavcodec
        STATIC
        IMPORTED
        )

SET_TARGET_PROPERTIES(
        libavcodec
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libavcodec.a
)

#add libavfilter
add_library(libavfilter
        STATIC
        IMPORTED
        )

SET_TARGET_PROPERTIES(
        libavfilter
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libavfilter.a
)


#add libavformat
add_library(libavformat
        STATIC
        IMPORTED
        )

SET_TARGET_PROPERTIES(
        libavformat
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libavformat.a
)


#add libavutil
add_library(libavutil
        STATIC
        IMPORTED
        )

SET_TARGET_PROPERTIES(
        libavutil
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libavutil.a
)


#add libpostproc
add_library(libpostproc
        STATIC
        IMPORTED
        )

SET_TARGET_PROPERTIES(
        libpostproc
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libpostproc.a
)

#add libswresample
add_library(libswresample
        STATIC
        IMPORTED
        )

SET_TARGET_PROPERTIES(
        libswresample
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libswresample.a
)

#add libswscale
add_library(libswscale
        STATIC
        IMPORTED
        )

SET_TARGET_PROPERTIES(
        libswscale
        PROPERTIES IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libswscale.a
)






find_library(
        log-lib
        log)

target_link_libraries(
        native-lib

        static-lib
        libavcodec
        libswscale
        libswresample
        libpostproc
        libavutil
        libavformat
        libavfilter

        ${log-lib})

 
4.6 cppテスト呼び出しの変更に成功
#include 
#include 
#include
#include "static.h"



#define  LOG_TAG    "native-lib"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)

extern "C"{
#include "include/libavutil/avutil.h"
}

extern "C" JNIEXPORT jstring JNICALL
Java_com_jbgf_naivesotest_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    //---------------------  --------------------
    int x = 0;
    x = apple();
    LOGI("x = %d", x);
    //----------------------------------------------
    return env->NewStringUTF(av_version_info());
}

extern "C"
JNIEXPORT jbyteArray JNICALL
Java_com_jbgf_naivesotest_MainActivity_bytesFromJNI(JNIEnv *env, jobject thiz) {
    jbyte byteA[8];
    byteA[0] = 1;
    byteA[1] = 1;
    byteA[2] = 1;
    byteA[3] = 1;
    byteA[4] = 1;
    byteA[5] = 1;
    byteA[6] = 1;
    byteA[7] = 1;



    jbyteArray jByteArray= env->NewByteArray(8);
    env->SetByteArrayRegion(jByteArray,0,8,byteA);
    return jByteArray;
}


extern "C"
JNIEXPORT jbyteArray JNICALL
Java_com_jbgf_naivesotest_MainActivity_bytesFromJNI2(JNIEnv *env, jobject thiz,
                                                     jbyteArray byte_frame) {
    //1.         
    jbyte *c_array = env->GetByteArrayElements(byte_frame,JNI_FALSE);
    int arr_len = env->GetArrayLength(byte_frame);

    //2.   java    
    env->ReleaseByteArrayElements(byte_frame, c_array, 0);

    //3.     
    for(int i=0 ; i< arr_len;i++)
    {
        c_array[i] = c_array[i] + 1;
        LOGI("123");

//        __android_log_print()
    }

    //4.       
    jbyteArray jbyteArray1 = env->NewByteArray(arr_len);
    env->SetByteArrayRegion(jbyteArray1, 0, arr_len, c_array);

    return jbyteArray1;
}

 
 
参考『FFmpegワンタッチコンパイルAndroid arm 64ビットと32ビット共有ライブラリ(armeabi-v 7 a arm 64-v 8 a)』