美文网首页
Android studio使用已经编译好的ffmpeg .so

Android studio使用已经编译好的ffmpeg .so

作者: liouville | 来源:发表于2020-12-10 01:08 被阅读0次

    一. 从C++返回hello world

    这一步是android studio自带功能

    新建工程时选择native c++即可 Screenshot from 2020-12-10 00-41-57.png

    做一个简单的记录

    1. build.gradle

    3处修改

    
    android {
        compileSdkVersion 29
        buildToolsVersion "29.0.3"
    
        defaultConfig {
            minSdkVersion 19
            targetSdkVersion 29
            versionCode 1
            versionName "1.0"
    
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
            consumerProguardFiles "consumer-rules.pro"
    
            // 1) 设置cppFlags
            externalNativeBuild {
                cmake {
                    cppFlags ""
                }
            }
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
    
    // 2) 指定 CMakeLists.txt的路径和版本 
        externalNativeBuild {
            cmake {
                path "src/main/cpp/CMakeLists.txt"
                version "3.10.2"
            }
        }
    // 3)as 3.6.3上需要加上这段代码,告诉gradle本地库的路径,4.0上不需要
     sourceSets {
            main {
                jniLibs.srcDirs = ['src/main/ffmpegLibs/lib']
            }
        }
    }
    
    
    1. 编写jni代码和对应的java调用代码

    jni代码

    
    #include <jni.h>
    #include <string>
    
    
    //这里的方法名字要和调用层 FFmpegWrapper的方法签名保持一致,
    //并且如果源文件是C++代码,要加上extern "C",不然会影响链接器链接,导致找不到方法
    
    ``
    extern "C"
    JNIEXPORT jstring JNICALL
    Java_com_lv_ffmpeg_FFmpegWrapper_ffmpegVersion(JNIEnv *env, jobject thiz) {
        std::string hello = "Hello from C++";
        return env->NewStringUTF(hello.c_str());
    }
    

    java调用代码

    public class FFmpegWrapper {
    
        //加载.so
        static {
            System.loadLibrary("native-lib");
        }
      
    
        public native static String ffmpegVersion();
    }
    
    1. 编写CmakeFile
    # 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.4.1)
    
    # 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
    
                           # Links the target library to the log library
                           # included in the NDK.
                           ${log-lib} )
    
    

    二. 使用编译好的.so

    1. 设置支持的CPU架构
     defaultConfig {
            applicationId "com.lv.media_demo"
            minSdkVersion 19
            targetSdkVersion 29
            versionCode 1
            versionName "1.0"
    
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
          
          //由于编译的.so是架构类型是arm64-v8a,所以这里限制只支持'arm64-v8a
            ndk {
                //abiFilters 'armeabi-v7a' //, 'arm64-v8a', 'x86', 'x86_64', 'mips', 'mips64'
                abiFilters 'arm64-v8a' //, 'arm64-v8a', 'x86', 'x86_64', 'mips', 'mips64'
            }
        }
    
    
    1. 复制头文件和.so文件到工程


      Screenshot from 2020-12-10 01-01-49.png
    1. 修改cmakefile.txt

    有4出修改

    
    # 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.4.1)
    
    # 1) 设置.so和头文件存放的位置
    set(jni_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../ffmpegLibs)
    
    
    # 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)
    
    # 2) 设置头文件的查找路径
    target_include_directories(native-lib PRIVATE
            ${jni_DIR}/include)
    
    
    # 3)添加一个.so依赖
    add_library(avcodec SHARED IMPORTED)
    set_target_properties(avcodec PROPERTIES IMPORTED_LOCATION
            ${jni_DIR}/lib/${ANDROID_ABI}/libavcodec.so)
    
    
    add_library(avformat SHARED IMPORTED)
    set_target_properties(avformat PROPERTIES IMPORTED_LOCATION
            ${jni_DIR}/lib/${ANDROID_ABI}/libavformat.so)
    
    
    add_library(avfilter SHARED IMPORTED)
    set_target_properties(avfilter PROPERTIES IMPORTED_LOCATION
            ${jni_DIR}/lib/${ANDROID_ABI}/libavfilter.so)
    
    
    add_library(avutil SHARED IMPORTED)
    set_target_properties(avutil PROPERTIES IMPORTED_LOCATION
            ${jni_DIR}/lib/${ANDROID_ABI}/libavutil.so)
    
    add_library(swscale SHARED IMPORTED)
    set_target_properties(swscale PROPERTIES IMPORTED_LOCATION
            ${jni_DIR}/lib/${ANDROID_ABI}/libswscale.so)
    
    add_library(swresample SHARED IMPORTED)
    set_target_properties(swresample PROPERTIES IMPORTED_LOCATION
            ${jni_DIR}/lib/${ANDROID_ABI}/libswresample.so)
    
    
    # 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.
    
    # 4) 添加到链接库
    target_link_libraries( # Specifies the target library.
            native-lib
            avcodec
            avformat
            avfilter
            avutil
            swscale
            swresample
            # Links the target library to the log library
            # included in the NDK.
            ${log-lib})
    
    
    
    1. 修改native-lib.cpp,获取ffmpeg的版本号
    
    #include <jni.h>
    #include <string>
    
    extern "C" {
    #include "libavutil/avutil.h"
    }
    
    extern "C"
    JNIEXPORT jstring JNICALL
    Java_com_lv_ffmpeg_FFmpegWrapper_ffmpegVersion(JNIEnv *env, jclass clazz) {
        std::string hello = "Hello from C++";
        return env->NewStringUTF(av_version_info());
    }
    
    

    相关文章

      网友评论

          本文标题:Android studio使用已经编译好的ffmpeg .so

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