ffmpeg-android studio创建jni项目

这篇具有很好参考价值的文章主要介绍了ffmpeg-android studio创建jni项目。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、创建native项目

1.1、选择Native C++

ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

1.2、命名项目名称

ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

1.3、选择C++标准

ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

1.4、项目结构

ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

1.5、app的build.gradle

plugins {
    id 'com.android.application'
}

android {
    compileSdk 32

    defaultConfig {
        applicationId "com.anniljing.ffmpegnative"
        minSdk 25
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags '-std=c++11'
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    externalNativeBuild {
        cmake {
            path file('src/main/cpp/CMakeLists.txt')
            version '3.18.1'
        }
    }
    buildFeatures {
        viewBinding true
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.android.material:material:1.9.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
  • android -> defaultConfig ->externalNativeBuild -> cmake
    配置c++使用标准
  • android -> externalNativeBuild -> cmake
    1 、配置cmake文件路径
    2、配置cmake的版本

1.6、CMakeLists.txt

cmake_minimum_required(VERSION 3.18.1)

project("ffmpegnative")


add_library( # Sets the name of the library.
        ffmpegnative

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        native-lib.cpp)

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)


target_link_libraries( # Specifies the target library.
        ffmpegnative

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})
  • cmake_minimum_required
    cmake最低版本要求

  • project
    设置项目名称

  • add_library
    添加库并设置库的源文件
    1、 Normal Libraries

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [<source>...])

name:库名称
STATIC|SHARED|MODULE:库类型(静态、动态、模块)
source:源文件

2、Imported Libraries

add_library(<name> <type> IMPORTED [GLOBAL])

导入已经生成的库,通常情况搭配set_target_properties,指定库的相关配置信息

set_target_properties(target1 target2 ...
                      PROPERTIES prop1 value1
                      prop2 value2 ...)
  • find_library
    查找本地库,一般位于NDK中
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)

ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

  • target_link_libraries
    用于指定目标(target)与其所需的库之间的链接关系。它被用于在构建过程中将库文件链接到可执行文件或共享库。
target_link_libraries(
        ffmpegnative
        ${log-lib})

将log-lib库链接到ffmpegnative中

二、配置FFmpeg头文件和库

2.1、配置FFmpeg头文件

#设置头文件路径
include_directories(${CMAKE_SOURCE_DIR}/include)

ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

2.2、配置ffmpeg相关的so库

2.2.1、添加so库

#声明ffmpeg_lib_dir变量,设置统一的库文件路径
set(ffmpeg_lib_dir ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
#添加ffmpeg相关的库
#avcodec(音视频编解码核心库)
add_library( avcodec
        SHARED
        IMPORTED )
set_target_properties( avcodec
        PROPERTIES IMPORTED_LOCATION
        ${ffmpeg_lib_dir}/libavcodec.so )

#avfilter(音视频滤镜库 如视频加水印、音频变声)
add_library( avfilter
        SHARED
        IMPORTED)
set_target_properties( avfilter
        PROPERTIES IMPORTED_LOCATION
        ${ffmpeg_lib_dir}/libavfilter.so )

#swscale(图像格式转换的模块)
add_library( swscale
        SHARED
        IMPORTED)
set_target_properties( swscale
        PROPERTIES IMPORTED_LOCATION
        ${ffmpeg_lib_dir}/libswscale.so )

#avformat(音视频容器格式的封装和解析)
add_library( avformat
        SHARED
        IMPORTED)
set_target_properties( avformat
        PROPERTIES IMPORTED_LOCATION
        ${ffmpeg_lib_dir}/libavformat.so )

#avdevice(输入输出设备库,提供设备数据的输入与输出)
add_library( avdevice
        SHARED
        IMPORTED)
set_target_properties( avdevice
        PROPERTIES IMPORTED_LOCATION
        ${ffmpeg_lib_dir}/libavdevice.so )

#avutil(核心工具库)
add_library( avutil
        SHARED
        IMPORTED )
set_target_properties( avutil
        PROPERTIES IMPORTED_LOCATION
        ${ffmpeg_lib_dir}/libavutil.so )

#swresample(音频重采样)
add_library( swresample
        SHARED
        IMPORTED )
set_target_properties( swresample
        PROPERTIES IMPORTED_LOCATION
        ${ffmpeg_lib_dir}/libswresample.so )

ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

2.2.2、链接ffmpeg库

target_link_libraries(
        ffmpegnative
        #链接ffmpeg相关库
        avutil
        swresample
        avcodec
        avfilter
        swscale
        avformat
        avdevice
        #链接本地日志库
        ${log-lib})

ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

2.3、ffmpeg静态库配置

2.3.1、拷贝静态库到jniLibs文件夹

ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

2.3.2、把静态库路径设置到默认的编译变量或者库的搜索变量中

2.3.2.1、设置CMAKE_CXX_FLAGS

CMAKE_CXX_FLAGS 是 CMake 构建系统中用于设置 C++ 编译器选项的变量。通过设置 CMAKE_CXX_FLAGS 变量,您可以向编译器传递各种编译选项和标志。

#声明ffmpeg路径变量,设置统一的库文件路径
set(FFMPEG_DIR ${CMAKE_SOURCE_DIR}/../jniLibs/ffmpeg)
#声明ffmpeg包含所有库变量
set(FFMPEG_LIB avformat avcodec avdevice avfilter avutil swresample swscale)
set(ANDROID_LIB z -landroid log)

#设置ffmpeg库文件路径
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${FFMPEG_DIR}/lib/${ANDROID_ABI}")
#设置ffmpeg的头文件
include_directories(${FFMPEG_DIR}/include)

CmakeLists.txt

cmake_minimum_required(VERSION 3.18.1)

project("ffmpegnative")

#声明ffmpeg路径变量,设置统一的库文件路径
set(FFMPEG_DIR ${CMAKE_SOURCE_DIR}/../jniLibs/ffmpeg)
#声明ffmpeg包含所有库变量
set(FFMPEG_LIB avformat avcodec avdevice avfilter avutil swresample swscale)
set(ANDROID_LIB z -landroid log)


#设置ffmpeg库文件路径
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${FFMPEG_DIR}/lib/${ANDROID_ABI}")
#设置ffmpeg的头文件
include_directories(${FFMPEG_DIR}/include)


add_library(
        ffmpegnative
        SHARED
        native-lib.cpp

)


target_link_libraries(
        ffmpegnative
        #链接ffmpeg相关库
        ${FFMPEG_LIB}
        #链接本地日志库
        ${ANDROID_LIB})
2.3.2.2、使用LINK_DIRECTORIES,设置静态库

LINK_DIRECTORIES是CMake构建系统中的一个命令,用于指定编译器在链接阶段查找库文件的搜索路径

在CMakeLists.txt文件中,可以使用LINK_DIRECTORIES命令来指定库文件的搜索路径

#声明ffmpeg路径变量,设置统一的库文件路径
set(FFMPEG_DIR ${CMAKE_SOURCE_DIR}/../jniLibs/ffmpeg)
#声明ffmpeg包含所有库变量
set(FFMPEG_LIB avformat avcodec avdevice avfilter avutil swresample swscale)
set(ANDROID_LIB z -landroid log)


#设置ffmpeg库文件搜索路径
LINK_DIRECTORIES(${FFMPEG_DIR}/lib/${ANDROID_ABI})
#设置ffmpeg的头文件
include_directories(${FFMPEG_DIR}/include)

CmakeLists.txt

cmake_minimum_required(VERSION 3.18.1)

project("ffmpegnative")

#声明ffmpeg路径变量,设置统一的库文件路径
set(FFMPEG_DIR ${CMAKE_SOURCE_DIR}/../jniLibs/ffmpeg)
#声明ffmpeg包含所有库变量
set(FFMPEG_LIB avformat avcodec avdevice avfilter avutil swresample swscale)
set(ANDROID_LIB z -landroid log)


#设置ffmpeg库文件搜索路径
LINK_DIRECTORIES(${FFMPEG_DIR}/lib/${ANDROID_ABI})
#设置ffmpeg的头文件
include_directories(${FFMPEG_DIR}/include)


add_library(
        ffmpegnative
        SHARED
        native-lib.cpp

)


target_link_libraries(
        ffmpegnative
        #链接ffmpeg相关库
        ${FFMPEG_LIB}
        #链接本地日志库
        ${ANDROID_LIB})

三、编译测试

3.1、错误一

ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

  • 把1.6.1修改为1.5.1

ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

3.2、编译arm64-v8a错误

ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

  • 因为我们只配置了armeabi-v7a,所以我们需要指定只编译armeabi-v7a的
    ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

3.3、多个相同文件问题

ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

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

ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

3.4、找不到so库文件

为了使目录更加清晰,我在jniLibs目录下增加了新的目录,运行以后,程序报出无法找到so库文件,生成的apk文件里面也没有把相关的so库打包进去
ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android
ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android
ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android
解决方案:

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

在build.gradle的文件下配置好so库文件所在的路径
ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

四、调用ffmpeg相关api

4.1、声明native函数

public native String getFFmpegVersion();

ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

4.2、实现native函数

#include <libavformat/avformat.h>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_anniljing_ffmpegnative_MainActivity_getFFmpegVersion(JNIEnv *env, jobject thiz) {
    const char* version = av_version_info();

    return env->NewStringUTF(version);
}

ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android
ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

  • 没有正确添加依赖,指定确保C++编译器按照C语言的约定处理函数
    ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android

4.3、调用测试

ffmpeg-android studio创建jni项目,jni,ffmpeg,android studio,android文章来源地址https://www.toymoban.com/news/detail-699179.html

到了这里,关于ffmpeg-android studio创建jni项目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安卓Android Studio JNI开发问题澄清与汇总

    AndroidBitmap_lockPixels和AndroidBitmap_unlockPixels的底层逻辑就是在处理bitmap中的数据的时候,把内存锁定,防止像素缓存被改变导致数据变化。 这篇文章有具体介绍相关的机制 下面是Bitmap操作的示例代码: Java端代码: 使用时,可以直接调用NativeUtils中的processImage方法即可。当然,

    2023年04月09日
    浏览(44)
  • 使用Android Studio创建第一个小项目(登录页面)

    仅供参考,学习使用 我这里了就直接创建一个模块了 然后选择Empty Activity 接下来直接点finish 我没有艺术细胞,所以画的比较差,大家不要介意 点击下面我图片的箭头处 然后点击split ####删掉我图片中的内容 然后点回design 点击旁边的TextView,拖动到方框中来 接着我们让这个

    2024年02月07日
    浏览(42)
  • Android Studio 创建项目不自动生成BuildConfig文件

    今天在AS上新建项目发现找不到BuildConfig文件,怎么clear都不行。通过多方面查找发现原来gradle版本不同造成的,Gradle 8.0默认不生成 BuildConfig 文件。 如上图,8.0版本是没有source文件夹 上图是低于8.0版本有source文件夹 针对这个问题,有两种解决办法        方法一:降低Gr

    2024年01月22日
    浏览(38)
  • Flutter在Android Studio上创建项目与构建模式

    一、安装插件     1、前提条件,安装配置好Android Studio环境     2、安装Flutter和Dart插件          Linux或者Windows平台: 1)、打开 File    Settings。 2)、在左侧列表中,选择 \\\" Plugins \\\" 右侧上方面板选中  \\\"Marketplace\\\" 在搜索框中输入“flutter”,选择Flutter插件,点击“Install”安

    2024年02月04日
    浏览(36)
  • Android Studio 2022.1.1创建项目的Gradle配置

    今天使用Android Studio建了一个新项目,遇到了不少问题,网上也找了不少解决方案都无效(可能Studio版本、项目版本等都不一样,解决办法也不一样吧),最后问题解决,总结梳理以下几点: Android Studio版本:2022.1.1 Gradle版本:7.5 Android Gradle Plugin Version:7.4.2 JDK版本:Java 1

    2024年02月06日
    浏览(35)
  • Android studio配置OpenCV的JNI接口,实现C++代码编程

    目录 一、下载OpenCV-android-sdk 二、新建项目 三、导入OpenCV包  四、配置OpenCV的JNI接口,拷贝OpenCV所需的头文件和库文件 五、修改Cmake文件  六、配置app的build.gradle文件  七、测试 OpenCV官网地址:https://opencv.org/  点击Library--Releases,下载Android版本,解压得到 OpenCV-android-sdk文件

    2024年02月10日
    浏览(34)
  • Android Studio更新新版本后无法创建flutter项目

    最新更新了AndroidStudio版本,发现无法创建flutter项目。 dart和flutter插件确认都已安装,该有的环境配置都已配置。 最后与同事的插件作比较发现是Android APK Support这个插件没勾选。 勾选后,点击右下角的apply,重启AndroidStudio。 然后去点击File--New--New Flutter Project。

    2024年02月09日
    浏览(36)
  • OpenCV(一):Android studio jni配置OpenCV(亲测有效,保姆级)

    目录 1.下载OpenCV的SDK 2.创建Android Native C++项目 3.Android项目中导入OpenCV工程 4.导入OpenCV的库文件 5.实现opencv高斯模糊图像处理的demo 要在Android Studio中配置使用OpenCV库的C++方法,需要完成以下步骤: 1.下载OpenCV的SDK 首先,您可以从OpenCV官方网站(Releases - OpenCV )下载适用于And

    2024年02月03日
    浏览(36)
  • 【环境配置】Android-Studio-OpenCV-JNI以及常见错误 ( 持续更新 )

    最近一个项目要编译深度学习的库,需要用到 opencv 和 JNI,本文档用于记录环境配置中遇到的常见错误以及解决方案 解决办法: 删除文件 .idea/gradle.xml 和 .idea/workspace.xml , 重新编译; 解决办法:Invalid Gradle JDK configuration found 原因是NDK版本过高,跟当前的AndroidStudio版本不匹配

    2024年02月11日
    浏览(29)
  • 利用android studio 生成 JNI需要的动态库so文件 图文详解

    到官网下载,此处不再陈述 JNI 是JDK里的内容,电脑上正确安装并配置JDK即可。 直接在Android studio下载(File----Settings) 工具一: AndroidStudio下载安装cmake(调试Native时会使用到LLDB,请一同勾选下载安装) 工具二: 用NDK的脚本工具使用ndk-build 新建项目,选择Native C++,如下图所

    2024年02月09日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包