二、Android Studio集成ffmpeg so

目录

1、前言

2、新建AS工程

2.1 选择Native C++

2.2 按图编辑和编辑

2.3 选择C++标准

2.4 最初工程目录展示

3、拷贝so库到AS

4、编辑CMakeLists.txt

5、修改build.gradle

6、编辑Native-lib.cpp

7、修改MainActivity.java

8、效果展示


 

1、前言

本文章之前也是参考了很多教程,五花八门,别人的成功了,自己试却还是遇到很多坑。可能跟自己用的android studio版本有关系?我用的是目前最新的(如下图,打字不如上图)。所以还是自己亲手操作并记录下来(保姆级教程)。

9f70059e312f47ed9553f5b4341fc3e6.png

2、新建AS工程

有两种建工程方式可以集成so,一种是自己配置,一种是AS“自带的”----Native C++。这里选择简单的Native C++,非该方式的后面有时间再来补充。

2.1 选择Native C++

选择Native C++,点击Next。

4abadef9527a4751a9a23393a27722ee.png

2.2 按图编辑和编辑

注意选择Java、build.gradle(其他方式不熟悉),选好后点击Next。

860da9133c3a4d818f8a66280c6c2e29.png

2.3 选择C++标准

我选择了Toolchain Default,然后点击finish。

a62dbe47d3c84e1a8406e41d70d58b45.png

2.4 最初工程目录展示

可以看到,比一般工程多了一个cpp目录,里面还有一个.cpp文件和一个CMakeLists.txt,这两个就是我们接下来要编辑的,也就是它搭建了java调用c/c++的桥梁(具体原理和介绍可以百度JNI相关)。

这样,该类工程AS已经把集成C/C++ so库的框架打好了,我们只需要做一些简单的配置就可以集成我们交叉编译的库了。

6d0c65f58fd24368a3cc131d43a6644a.png

3、拷贝so库到AS

在cpp目录(感觉这个位置比较合适,别的位置也可以,能在CMakeLists.txt找到就行)下创建一个目录——ffmpegLibs7-0-2,以存放交叉编译好的so和头文件,目前手机大部分都是64位的,这里我只拷贝了arm64-v8a的。如图:

6e18d85f38394e7e95fa2618121bfc1a.png

4、编辑CMakeLists.txt

这一步非常关键。工程生成的CMakeLists.txt只是将native-lib封装成了一个jni库,这个库是供java调用的,而我们交叉编译的库是这个jni库来调用的,这样就实现了java间接调用我们交叉编译的so的接口了。编辑CMakeLists.txt如下:

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html.
# For more examples on how to use CMake, see https://github.com/android/ndk-samples.# Sets the minimum CMake version required for this project.
cmake_minimum_required(VERSION 3.22.1)# Declares the project name. The project name can be accessed via ${ PROJECT_NAME},
# Since this is the top level CMakeLists.txt, the project name is also accessible
# with ${CMAKE_PROJECT_NAME} (both CMake variables are in-sync within the top level
# build script scope).
project("ffmpegtestprj")# 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.
#
# In this top level CMakeLists.txt, ${CMAKE_PROJECT_NAME} is used to define
# the target library name; in the sub-module's CMakeLists.txt, ${PROJECT_NAME}
# is preferred for the same purpose.
#
#定义交叉编译库的基本目录,方便下面指定头文件目录和库的目录
set(PREFIX "${CMAKE_SOURCE_DIR}/ffmpegLibs7-0-2/")
#包含ffmpeg头文件目录
include_directories(${PREFIX}/include)
#添加交叉编译库的目录
link_directories(${PREFIX}/lib)#添加库,这一步不能漏,这个和我们平时开发C++代码时不太一样,一般我们是直接在目标库中链接就可以
#而这里需要重新添加一下。有些博客这里不添加,在build.gradle里面指定库的路径(该方式我自己试了不行,
#会报xxx.so is not an ABI,应该是我们自己交叉编译的so,AS是不认识的,接口不匹配;这个坑我踩了很久)。
#这里重新添加的原理我还没找到官方的说法,我理解这么做的原理还是因为java程序不能直接访问该库,只能告诉
#目标库,让目标库去加载。(这里我还做了一个尝试,就是把ffmpeg里面的jni选项打开,以为java程序就可以
#直接访问(build.gradle里指定jniLibs)了,但还是不行,还是报xxx.so is not an ABI)
add_library(avcodecSHAREDIMPORTED
)
set_target_properties(avcodecPROPERTIES IMPORTED_LOCATION${PREFIX}/lib/libavcodec.so
)add_library(avdeviceSHAREDIMPORTED
)
set_target_properties(avdevicePROPERTIES IMPORTED_LOCATION${PREFIX}/lib/libavdevice.so
)add_library(avfilterSHAREDIMPORTED
)
set_target_properties(avfilterPROPERTIES IMPORTED_LOCATION${PREFIX}/lib/libavfilter.so
)add_library(avformatSHAREDIMPORTED
)
set_target_properties(avformatPROPERTIES IMPORTED_LOCATION${PREFIX}/lib/libavformat.so
)add_library(avutilSHAREDIMPORTED
)
set_target_properties(avutilPROPERTIES IMPORTED_LOCATION${PREFIX}/lib/libavutil.so
)add_library(postprocSHAREDIMPORTED
)
set_target_properties(postprocPROPERTIES IMPORTED_LOCATION${PREFIX}/lib/libpostproc.so
)add_library(swresampleSHAREDIMPORTED
)
set_target_properties(swresamplePROPERTIES IMPORTED_LOCATION${PREFIX}/lib/libswresample.so
)add_library(swscaleSHAREDIMPORTED
)
set_target_properties(swscalePROPERTIES IMPORTED_LOCATION${PREFIX}/lib/libswscale.so
)# In order to load a library into your app from Java/Kotlin, you must call
# System.loadLibrary() and pass the name of the library defined here;
# for GameActivity/NativeActivity derived applications, the same library name must be
# used in the AndroidManifest.xml file.
add_library(${CMAKE_PROJECT_NAME} SHARED# List C/C++ source files with relative paths to this CMakeLists.txt.native-lib.cpp)# Specifies libraries CMake should link to your target library. You
# can link libraries from various origins, such as libraries defined in this
# build script, prebuilt third-party libraries, or Android system libraries.
target_link_libraries(${CMAKE_PROJECT_NAME}# List libraries link to the target library#ffmpeg链接到native-libavcodecavdeviceavfilteravformatavutilpostprocswresampleswscaleandroidlog)

5、修改build.gradle

修改app目录下的build.gradle,在defaultConfig中添加cmake并指定平台,因为我们只导入一个平台的库(我是用手机运行的)

efb66f608bb6444897fa82a9a219824b.png

6、编辑Native-lib.cpp

至此,其实就可以运行看一下效果了,急迫的你可以运行试试。不过目前我们还没有调用ffmpeg接口,为了验证我们AS能否正常调用ffmpeg接口,我们就把它调用起来。这里是调用libavcodec/avcodec.h下的avcodec_configuration接口打印配置信息。

Native-lib.cpp新增getAvCodecConfigurationInfo接口,调用avcodec_configuration,将返回的信息作为jni接口返回值。

#include <jni.h>
#include <string>
extern "C"{//必须要添加该声明
#include "libavcodec/avcodec.h"
}extern "C" JNIEXPORT jstring JNICALL
Java_com_example_ffmpegtestprj_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */) {std::string hello = "Hello from C++";return env->NewStringUTF(hello.c_str());
}extern "C" JNIEXPORT jstring JNICALL
Java_com_example_ffmpegtestprj_MainActivity_getAAvCodecConfigure(JNIEnv* env,jobject /* this */) {std::string hello = avcodec_configuration();return env->NewStringUTF(hello.c_str());
}

7、修改MainActivity.java

MainActivity.java新增声明一个jni接口:

public class MainActivity extends AppCompatActivity {// Used to load the 'ffmpegtestprj' library on application startup.static {System.loadLibrary("ffmpegtestprj");}private ActivityMainBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());// Example of a call to a native methodTextView tv = binding.sampleText;//tv.setText(stringFromJNI());tv.setText(getAAvCodecConfigure());}/*** A native method that is implemented by the 'ffmpegtestprj' native library,* which is packaged with this application.*/public native String stringFromJNI();public native String getAAvCodecConfigure();
}

这里就不再新增控件了,直接将之前的text显示换成显示getAvCodecConfigurationInfo返回的。

8、效果展示

08201f721cda465289419272a6130829.jpeg

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/421085.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML5中IndexedDB前端本地数据库

一、indexedDB为何替代了Web SQL Database&#xff1f; 跟小朋友的教育从来没有什么“赢在起跑线”这种说法一样&#xff0c;在前端领域&#xff0c;也不是哪来先出来哪个就在日后引领风骚的。 HTML5 indexedDB和Web SQL Database都是本地数据库数据存储&#xff0c;Web SQL Da…

DX-5009N 10G交换机 SFP接口+猫棒 代替运营商光猫 【注册状态O5但是无法PPPoe拨号踩坑——交换机VLAN配置】

买了个诺基亚 猫棒&#xff0c;准备代替光猫&#xff0c;还弱电箱一个清净 参数填完一切正常&#xff0c;注册状态O5 但是openwrt拨号死活上不去。windows拨号也是651 网络架构 SPF口与网口8为同一vlan&#xff0c;做光电转换&#xff0c;交给路由器wan口 路由器PPPoe拨号 1-7网…

『功能项目』播放动画时禁止点击移动【40】

我们打开上一篇39GameObject对象池 - 第三职业的项目&#xff0c; 本章要做的事情是在第三职业播放续航攻击动画时禁止点击时触发的移动函数&#xff0c;换句话说是在播放攻击动画时禁止移动 修改脚本&#xff1a;PlayerRayClickNavigation.cs 运行项目 - 播放第三职业续航技能…

(十四)、为 SpringCloud 项目生成 Docker 镜像

文章目录 1、原理2、最佳实践2.1、获得 SpringCloud 微服务启动模块的 jar 文件2.2、准备文件夹和 Dockerfile 文件2.3、 Dockerfile 文件的内容2.4、通过命令行构件新镜像 3、异常情况和处理&#xff1a;failed to create LLB definition3.1、现象3.2、解决配置国内镜像仓库清…

OpenGL——着色器画一个点

一、 绘制 在窗口中间画一个像素点&#xff1a; #include <GL/glew.h> #include <GLFW/glfw3.h> #include <iostream>using namespace std;#define numVAOs 1GLuint renderingProgram; GLuint vao[numVAOs];GLuint createShaderProgram () {const char *v…

SQL的增删改查CRUD练习知识点(day27)

1 学习目标 重点掌握插入单条记录的语法了解全表插入记录的语法重点掌握修改记录的语法重点掌握删除记录的语法重点掌握主键约束、外键约束了解检查约束、非空约束、唯一约束 2 数据类型 MySQL支持多种数据类型&#xff0c;大致可以分类三类&#xff1a;数值、日期和字符串。…

【Maven】Maven 下载安装教程(超详细)(day30)

1 学习目标 了解Spring了解SpringBoot重点掌握创建SpringBoot项目重点掌握聚合项目的创建了解Spring基于XML方法进行IOC和依赖注入了解Maven的概念重点掌握使用Maven构建项目重点掌握使用Maven进行依赖引入 2 Maven 2.1 概述 Maven是跨平台的项目管理工具。作为Apache组织中…

Python(一)-快速入门

第一个入门实例 print(hello python) 注释 #:单行注释""" """:多行注释 # 这是单行注释 # 输出一个喜欢读的课外书 print("我最喜欢读 追风筝的人")print("----------------------------")"""这是多…

Python爱心射线

系列目录 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码8Python普通的玫瑰花代码9Python炫酷的玫瑰花代码10Python多…

004——双向链表和循环链表

目录 双向链表 双向链表的初始化&#xff08;与单链表类似&#xff09; 增&#xff1a; Ⅰ&#xff09;头插法 Ⅱ&#xff09;尾插法 Ⅲ&#xff09;中间插入 删 改 查 整体代码示例&#xff1a; 循环链表 循环单链表 ​编辑 循环双链表 双向链表 不同于单链表&…

2024年录屏神器大盘点,轻松捕捉屏幕精彩

现在讲解一些操作越来越便捷了&#xff0c;我 一般都是用录屏工具来边录制操作边讲解&#xff0c;这样可以更方便对方了解操作步骤。这次我就分享几款免费录屏工具一起来试试吧。 1.福晰录屏软件 链接&#xff1a;www.foxitsoftware.cn/REC/ 对于初次尝试录屏的新手来说&…

每天五分钟玩转深度学习框架PyTorch:获取神经网络模型的参数

本文重点 当我们定义好神经网络之后,这个网络是由多个网络层构成的,每层都有参数,我们如何才能获取到这些参数呢?我们将再下面介绍几个方法来获取神经网络的模型参数,此文我们是为了学习第6步(优化器)。 获取所有参数Parameters from torch import nn net=nn.Sequent…

Java | Leetcode Java题解之第397题整数替换

题目&#xff1a; 题解&#xff1a; class Solution {public int integerReplacement(int n) {int ans 0;while (n ! 1) {if (n % 2 0) {ans;n / 2;} else if (n % 4 1) {ans 2;n / 2;} else {if (n 3) {ans 2;n 1;} else {ans 2;n n / 2 1;}}}return ans;} }

UE5引擎工具链知识点

当我们提到“引擎工具链的开发”时&#xff0c;通常指的是为游戏开发或其他类型的软件开发创建一系列工具和技术栈的过程。这包括但不限于游戏引擎本身&#xff08;如Unity或Unreal Engine&#xff09;&#xff0c;以及围绕这些引擎构建的各种工具和服务&#xff0c;比如用于构…

CTFHub技能树-Git泄漏-Index

目录 一、Git索引&#xff08;Index&#xff09;的基本概念 二、解题过程 主旨&#xff1a;使用git泄漏恢复源代码 方法一&#xff1a;使用GitHack手动恢复 方法二&#xff1a;直接使用Git_Extract获取网站源代码拿去flag 当前大量开发人员使用git进行版本控制&#xff0c…

新书宣传:《量子安全:信息保护新纪元》

《量子安全&#xff1a;信息保护新纪元》 前言本书的看点本书的目录结语 前言 你好&#xff01; 这是我第一次发布类广告的博文&#xff0c;目的也很单纯&#xff0c;希望以作者的身份介绍一下自己出版的图书——《量子安全&#xff1a;信息保护新纪元》。此书于2024年7月出版…

【鸿蒙】HarmonyOS NEXT星河入门到实战1-开发环境准备

目录 一、达成目标 二、鸿蒙开发环境准备 2.1 开发者工作下载 2.2 解压安装 2.3 运行配置安装node.js和SDK 2.4 开始创建第一个项目 2.5 预览 2.5.1 预览遇到的问题&#xff08;报错&#xff09; 2.5.2 修改内容查看预览 三、备用下载地址&#xff08;如果下载是4.X版…

会声会影2024发布了没有? 会声会影2024更新哪些内容?

嘿&#xff0c;亲爱的的朋友们&#xff0c;今天我要跟大家安利一款让我彻底沉迷、不能自拔的神器 —— 会声会影2024&#xff01;如果你还在为视频编辑头疼&#xff0c;那么准备好迎接你的救星吧&#xff01; 会声会影2024是一款功能全面的视频编辑软件&#xff0c;它不仅能帮你…

基于Logistic-Map混沌序列的数字信息加解密算法matlab仿真,支持对文字,灰度图,彩色图,语音进行加解密

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于Logistic-Map混沌序列的数字信息加解密算法matlab仿真,系统包含GUI操作界面&#xff0c;系统支持对文字,灰度图,彩色图,语音进行加解密。 2.测试软件版本以及…

人工智能在C/C++中的应用

随着技术的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经成为我们日常生活中不可或缺的一部分。从智能手机的语音助手到自动驾驶汽车&#xff0c;AI的应用无处不在。在众多编程语言中&#xff0c;C和C因其高性能和灵活性&#xff0c;成为实现复杂AI算法的理想选…