​第20课 在Android Native开发中加入新的C++类

news/2024/2/28 19:22:34

​这节课我们开始利用ffmpeg和opencv在Android环境下来实现一个rtmp播放器,与第2课在PC端实现播放器的思路类似,只不过在处理音视频显示和播放的细节略有不同。

1.压缩备份上节课工程文件夹并修改工程文件夹为demo20,将demo20导入到Eclipse或者在原工程上继续下列的开发步骤。

2.右单击工程目录下的jni节点并添加一个新的C++类fmlp,如下图所示:

3.删除工程中的其它按钮,并添加id为startBtn的按钮:

<Buttonandroid:id="@+id/startBtn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:onClick="start"android:text="Start"/>

在MainActivity.java中添加以下代码:

Button startBtn;startBtn=(Button)findViewById(R.id.startBtn);                public native String startFF(String rtmpURL);public native String stopFF();

4.绑定单击事件start用于启动C++中的FFmpeg线程:

public void start(View view){ backWidth = Integer.toString(320);backHeight=Integer.toString(240);rtmpURL = "rtmp://192.168.0.100/vod/2.mp4";msgTxt.setText(startFF(rtmpURL));                } 

5.在jni目录下添加fmlp类:

fmlp.h内容如下:

class fmlp {public:fmlp();virtual ~fmlp();string init();};

fmlp.cpp内容如下:

std::stringfmlp::init() {return"Hello fmlp...";}

6.在demo.cpp中添加启动FFmpeg的代码:

JNIEXPORT jstring JNICALL Java_com_example_demo_MainActivity_startFF(JNIEnv *env, jobject obj) {if(myFmlp==NULL){myFmlp =new fmlp();}std::string str=myFmlp->init();return env->NewStringUTF(str.c_str());}

7.在Android.mk中添加fmlp编译选项以使fmlp.cpp被编译,完整的Android.mk内容如下

LOCAL_PATH := $(call my-dir)#ffmpeg libinclude$(CLEAR_VARS)LOCAL_MODULE := avcodecLOCAL_SRC_FILES := lib/libavcodec.soinclude$(PREBUILT_SHARED_LIBRARY)include$(CLEAR_VARS)LOCAL_MODULE := avdeviceLOCAL_SRC_FILES := lib/libavdevice.soinclude$(PREBUILT_SHARED_LIBRARY)include$(CLEAR_VARS)LOCAL_MODULE := avfilterLOCAL_SRC_FILES := lib/libavfilter.soinclude$(PREBUILT_SHARED_LIBRARY)include$(CLEAR_VARS)LOCAL_MODULE := avformatLOCAL_SRC_FILES := lib/libavformat.soinclude$(PREBUILT_SHARED_LIBRARY)include$(CLEAR_VARS)LOCAL_MODULE := avutilLOCAL_SRC_FILES := lib/libavutil.soinclude$(PREBUILT_SHARED_LIBRARY)include$(CLEAR_VARS)LOCAL_MODULE := postprocLOCAL_SRC_FILES := lib/libpostproc.soinclude$(PREBUILT_SHARED_LIBRARY)include$(CLEAR_VARS)LOCAL_MODULE := swresampleLOCAL_SRC_FILES := lib/libswresample.soinclude$(PREBUILT_SHARED_LIBRARY)include$(CLEAR_VARS)LOCAL_MODULE := swscaleLOCAL_SRC_FILES := lib/libswscale.soinclude$(PREBUILT_SHARED_LIBRARY)#x264 libinclude$(CLEAR_VARS)LOCAL_MODULE := libx264LOCAL_SRC_FILES := lib/libx264.161.soinclude$(PREBUILT_SHARED_LIBRARY)#opencv libinclude$(CLEAR_VARS)LOCAL_MODULE := opencvLOCAL_SRC_FILES :=lib/libopencv_java3.soinclude$(PREBUILT_SHARED_LIBRARY)#demoinclude$(CLEAR_VARS)LOCAL_MODULE    := demoLOCAL_SRC_FILES := fmlp.cpp demo.cppLOCAL_C_INCLUDES += $(LOCAL_PATH)/include##-landroid参数 for native windowsLOCAL_LDLIBS := -llog -landroid#LOCAL_LDLIBS := -llog -lzLOCAL_SHARED_LIBRARIES :=opencv libx264 avcodec avdevice avfilter avformat avutil postproc swresample swscaleinclude$(BUILD_SHARED_LIBRARY)

调试运行,能正确返回信息"Hello fmlp..."则表示程序运行正常。


http://www.ppmy.cn/news/1334897.html

相关文章

LeetCode:376.摆动序列

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;算法_仍有未知等待探索的博客-CSDN博客 题目链接&#xff1a;376. 摆动序列 - 力扣&#xff08;LeetCode&#xff09; 一、题目 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称…

路口最短时间问题 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 假定街道是棋盘型的&#xff0c;每格距离相等&#xff0c;车辆通过每格街道需要时间均为 timePerRoad&#xff1b;街道的街口&#xff08;交叉点&#xff09;有交…

NoSQL基本内容

第一章 NoSQL 1.1 什么是NoSQL NoSQL&#xff08;Not Only SQL&#xff09;即不仅仅是SQL&#xff0c;泛指非关系型的数据库&#xff0c;它可以作为关系型数据库的良好补充。随着互联网web2.0网站的兴起&#xff0c;非关系型的数据库现在成了一个极其热门的新领域&#xff0c;…

EtherCAT主站SOEM -- 18 --Qt-Soem通过CSV模式(周期同步速度模式)控制一个电机转圈圈

EtherCAT主站SOEM -- 18 --Qt-Soem通过CSV模式(周期同步速度模式)控制一个电机转圈圈 0 QT-SOEM视频预览及源代码下载:0.1 QT-SOEM视频预览0.2 QT-SOEM源代码下载1 程序文件修改替换1.1 allvalue.h1.2 motrorcontrol.h1.3 mainwindow.cpp1.4 motrorcontrol.cpp2 ui界面显示该…

【阿里云服务器数据迁移】 同一个账号 不同区域服务器

前言 假如说一台云服务器要过期了,现在新买了一台,有的人会烦恼又要将重新在新的服务器上装环境,部署上线旧服务器上的网站项目, 但是不必烦恼,本文将介绍如何快速将就旧的服务器上的数据迁移到新的服务器上. 包括所有的环境和网站项目噢 ! 步骤 (1) 创建旧服务器自定义镜像…

《游戏-01_3D-开发》之—人物动画控制器

创建变量&#xff0c; 创建线&#xff0c; 连接&#xff0c; 选中线会变为蓝色&#xff0c;新增变量&#xff0c; 设置线&#xff0c; 双击子层进入子层&#xff0c; 创建变量&#xff0c; 双击SkillPanel 拖拽好之后返回上一层&#xff0c; 依次连接&#xff0c; 设置线&#…

使用 fdisk 和 mkfs 创建并挂载新硬盘

在Linux系统中&#xff0c;管理磁盘空间是一项关键的任务。有时&#xff0c;我们需要在系统中添加新的硬盘并将其用于特定的用途&#xff0c;比如存储日志文件。本文将介绍如何在Linux系统上使用fdisk和mkfs工具创建、格式化和挂载新硬盘。 1. 确认可用磁盘 首先&#xff0c;…

npm 报错 request to https://registry.cnpmjs.org/vue failed, reason:

npm 报错 request to https://registry.cnpmjs.org/vue failed, reason:_qq62581587d2bea的技术博客_51CTO博客 本来是非常简单的一个报错。 正常情况下&#xff0c;按照网上的方法就可以解决问题。 但是我尝试了使用代理、换源、重装node.js&#xff08;但是npm的配置参数没…

【Midjourney】内容展示风格关键词

1.几何排列(Geometric) "Geometric" 是一个与几何有关的词汇&#xff0c;通常用于描述与形状、结构或空间几何特征相关的事物。这个词可以涉及数学、艺术、工程、计算机图形学等多个领域。 使用该关键词后&#xff0c;图片中的内容会以平面图形拼接的方式展示&#…

6.2第三次作业

综合练习&#xff1a;请给openlab搭建web网站 网站需求&#xff1a; 1.基于域名www.openlab.com可以访问网站内容为welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料 和缴费网站&#xff0c;基于&#xff0c;www.openlab.com/data网站…

STM正点mini-新建工程模板,GPIO及寄存器(介绍)

一.新建工程模板(基于固件库) 1.1库函数与寄存器的区别 这里的启动文件都是根据容量来进行区分的 对MDK而言即使include了&#xff0c;也不知道在哪里找头文件 STM32F10X_HD,USE_STDPERIPH_DRIVER 二.新建工程模板(基于寄存器) 上面的大部分配置与固件库的一样 具体可以看手…

【PyTorch】n卡驱动、CUDA Toolkit、cuDNN全解安装教程

文章目录 GPU、NVIDIA Graphics Drivers、CUDA、CUDA Toolkit和cuDNN的关系使用情形判断仅仅使用PyTorch使用torch的第三方子模块 安装NVIDIA Graphics Drivers&#xff08;可跳过&#xff09;前言Linux法一&#xff1a;图形化界面安装&#xff08;推荐&#xff09;法二&#x…

GoJS—交互式图表开发的神器(海量案例)

一、GoJS是什么&#xff1a; GoJS是一个用于创建交互式可视化图表和图形的JavaScript库。它提供了丰富的功能和工具&#xff0c;使开发人员能够轻松地构建各种类型的图表&#xff0c;包括流程图、组织结构图、网络拓扑图等。GoJS具有灵活的布局和样式设置&#xff0c;可以通过简…

中国新能源汽车持续跑出发展“加速度”,比亚迪迎来向上突破

2023年已经过去&#xff0c;对于汽车圈而言&#xff0c;2023年是中国车市的分水岭&#xff0c;在这一年&#xff0c;中国汽车工业70年以来首次进入全球序列&#xff0c;自主品牌强势霸榜&#xff0c;销量首次超过合资车。要知道&#xff0c;这是自大众于1984年进入中国市场成立…

04_前后端交互技术之Ajax异步请求

本课目标 理解什么是同步请求和异步请求理解Ajax的请求原理掌握Ajax的基本用法掌握课堂案例 1. 同步请求与异步请求的区别 1.1 什么是同步请求 同步请求&#xff1a;发送请求后需要等待服务端响应&#xff0c;同步请求阻止代码的执行&#xff0c;这会导致屏幕上出现“冻结”…

二叉树--98. 验证二叉搜索树/medium 理解度C

98. 验证二叉搜索树 1、题目2、题目分析3、复杂度最优解代码示例4、适用场景 1、题目 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 …

Linux 驱动开发基础知识—— 具体单板的 LED 驱动程序(五)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

【Vitest】 Vitest测试框架的简单使用

简言 在了解vue源码的时候接触到了vitest测试框架,它的官网语言有中文&#xff0c;所以本篇只作简单的使用介绍。 Vitest官网 Vitest 旨在将自己定位为 Vite 项目的首选测试框架&#xff0c;即使对于不使用 Vite 的项目也是一个可靠的替代方案。它本身也兼容一些Jest的API用法…

将小游戏打包成单一exe文件的原理及应用

哈喽大家好&#xff0c;我是咕噜美乐蒂&#xff0c;很高兴又见面啦&#xff01;本文将介绍将小游戏原版文件打包成单一exe文件的原理&#xff0c;并探讨了这种打包方式的优点和应用场景。通过对打包工具和编译器的介绍&#xff0c;解释了它们如何将游戏的所有相关文件合并到一个…

JAVA学习笔记四

1.java开发注意事项 1.java源文件以.java为扩展名。源文件的基本组成部分是类(class)&#xff0c;如本类中的Hello类 2.java应用程序的执行入口是main()方法&#xff0c;它有固定的书写格式&#xff1a; public static void main(String[] args) {...} 3.java语言严格区分大小写…
最新文章