当前位置: 首页 > news >正文

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

​这节课我们开始利用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..."则表示程序运行正常。

相关文章:

  • 听神经瘤的听力学表现
  • 【JavaEE】_基于UDP实现网络通信
  • 虚拟歌姬学习:DiffSinger,让GitHub下载快的方法!
  • 在人工智能时代,如何利用AI达到行业领先地位?
  • DophineScheduler通俗版
  • BOSS直聘推荐搜索系统工程师校招面经
  • mybatis类型转换器处理MYSQL数据库geometry类型转换
  • 免费的 UI 设计资源网站 Top 8
  • Java面试题136-150
  • LeeCode 3. 无重复字符的最长子串
  • Kafka(二)【文件存储机制 生产者】
  • 2024 年入局大模型:是否为时已晚?
  • 3.Eureka注册中心
  • 【C/C++】C/C++编程——C++ 开发环境搭建
  • Vue3+TS+dhtmlx-gantt实现甘特图
  • SegmentFault for Android 3.0 发布
  • 【译】理解JavaScript:new 关键字
  • httpie使用详解
  • maya建模与骨骼动画快速实现人工鱼
  • rabbitmq延迟消息示例
  • Rancher如何对接Ceph-RBD块存储
  • session共享问题解决方案
  • SpiderData 2019年2月13日 DApp数据排行榜
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 一起参Ember.js讨论、问答社区。
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (第一天)包装对象、作用域、创建对象
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (正则)提取页面里的img标签
  • (转)创业的注意事项
  • (转)负载均衡,回话保持,cookie
  • *1 计算机基础和操作系统基础及几大协议
  • *2 echo、printf、mkdir命令的应用
  • .gitignore文件—git忽略文件
  • .Net CF下精确的计时器
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .Net mvc总结
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @hook扩展分析
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [ C++ ] STL---string类的使用指南
  • [ C++ ] 继承
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [ 蓝桥杯Web真题 ]-布局切换
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • []常用AT命令解释()
  • [Android] Android ActivityManager