jni学习4.动态注册 静态注册较为简单,只需要在Java程序中声明jni函数,随后在cpp程序中实现此jni函数即可。静态注册的实现方式为:当java程序第一次使用某个jni函数时,会进行搜索,根据包名-类名-函数名进行搜索,随后与对应的jni函数建立连接,随后便可以调用。由于虚拟机自动实现了注册匹配,所以在实际编写中比较省力,名字匹配了就可以直接用。但是静态注册有一些缺点:1.函数名称需要匹配,不能自定义。2.每个jni函数第一次被调用时都需要搜索,增加了额外开销。如果工程中的jni函数较多,在搜索方面可能会花费较多时间。..
jni学习3.cpp代码在android studio打印日志 从代码中可知,“CPPLOG”就是日志的tag,可以自定义修改。代码运行时在logcat中搜索CPPLOG就可以找到相关的日志。为了方便调试,通常在Java代码中打印日志。但是在jni开发中,如果c++函数也需要打印日志进行调试,就必须进行额外设置。LOGD,LOGI,LOGE是三种类型的日志,和java日志原型是一一对应的。4.在Java程序中调用jni函数,日志输出结果。3.在jni函数中进行调用。...
jni学习2.c++调用java函数 这里需要注意com.example.hello_cmake.TestCallBack是类的完整路径,但是识别的时候是以Linux标准进行的,因此里面的.要替换成/来表示路径。jni函数本身也算是java类的一个成员方法,在调用的时候,需要先实例化TestCallBack类,再进行调用。在java中,类的成员方法必须以实例调用的形式调用,因此必须实例化一个对象,才能调用成员函数add。调用方法的函数参数中,前两个分别为实例与方法的ID,后面的参数则是调用的java方法的参数。第三步:实例化一个对象。.....
JNI学习1.环境配置与简单函数实现 本文使用的android studio版本是2021年的版本,自android studio之后对JNI的配置就比较简单,因为LLDB已经默认集成到了android studio中。打开SDK manager,在SDK tools里面将NDK与CMake一起下载即可,可以点击右下角的show package details,展示具体的版本进行下载安装。......
Android cannot resolve constructor intent解决 intent的原型是Intent(Contextcontext,Classclass),从当前的context跳转到class,问题在于当前的context到底是谁的context。由于监听器是一种内部类,所以在监听器中的this指代的并不是当前的活动,而是当前的监听器。上面的语句我写在了一个button的监听器中,这也是造成错误的原因。该语句的作用为从当前的活动跳转到活动MainActivity2。因此需要将context参数进行正确的定位。...
c++ RTTI RTTI的意思是运行时类型识别,之所以存在这个功能,是因为c++通过父类指针实现多态,父类指针可以指向自己所有的派生类对象,指的多了就会出现问题,程序到某一时刻,父类指针究竟指向哪种派生类对象呢?假设有个父类是Human,子类是Men(毕竟男人属于人类的一种)。通过以上语句,令Human类型的指针指向一个Men对象,Human类中存在虚函数,因此构成了一种多态。但是时间久了,隔了好多行代码,Human这个父类又有一堆子类,因此很容易在某个时间节点搞不清楚当前的*phuman指向的到底是哪种类型,因此需
c++读取配置文件 在实际开发中,程序读取配置文件以加载数据非常常见,如何安全高效地读取文件比较重要。本文代码来自于《c++新经典》。 假设有一个txt格式的文件,里面记录了花里胡哨的内容,需要把这些内容一字不差地读取到程序中,应该如何用c++实现?书中的代码如下:结果如下图所示,已经完整地将配置文件的内容打印出来了。 代码使用一个字符数组记录每行内容,为防止读取失败,代码中通过第一位清零并查询的方式检查:如果不需要代码非常严谨,可以将以上的内容从代码中删除。读取一行文本的核心实现是以下代码:fgets函数读
ffmpeg+SDL2实现音频播放 本文记录使用ffmpeg+SDL2进行视频文件内的音频播放,注意是播放视频文件内的音频,不是播放音频文件。本文使用的ffmpeg版本为5.0.1,SDL的版本为2.022。c++环境为vs2017。和之前的播放视频或音频明显的区别是,播放视频文件内的音频需要进行重采样操作,代码中会引入重采样结构体SwrContext。重采样结构体能够改变原先音频的采样率、声道数等参数,令各种音频能够按照我们设定的参数进行输出。这样做的原因是不同视频文件内的音频参数通常区别较大,如果分别处理工作量太大,不如将其统一成相同的格
SDL2播放pcm音频 作为播放器,只会播放视频还是不行的,因此需要研究一下SDL如何播放音频。SDL播放音频的过程相对于播放视频更为简单,主要流程如下:初始化工作:1.初始化SDL2.根据设定参数打开音频设备循环播放:1.播放音频数据2.延时等待播放完成#include <stdio.h>#include <tchar.h>#include <iostream>extern "C"{#include "SDL.h"};using namespac
ffmpeg+SDL2实现播放器(三) 前面的文章中实现一个固定帧率的视频播放器,但是光有播放功能似乎没有那个味道。因此本次增加了暂停/继续功能,按键关闭播放器功能,以及帧率改变功能。PS:实现帧率改变的初衷是改变播放视频的速度,但是总感觉这样的实现方式并不好,因为当你加速播放的时候,一秒内极有可能处理相当多的视频帧,会对播放设备产生明显影响,因此暂时认为对视频的加减速播放应该有更优的方案。整体代码如下:#include<iostream>#include<string.h>#include<SDL
ffmpeg+SDL2实现播放器(二) 在上一篇文章中,代码的画面刷新不是定期实现的,这就导致视频的播放速度与实际不符,因此我们需要对其进行修改,使用多线程实现画面刷新的控制。该工程使用的ffmpeg版本为5.01,SDL版本为2.0.22。#include<iostream>#include<string.h>#include<SDL.h>extern "C"{#include "libavformat/avformat.h" //头文件不仅要在项目中鼠标点击配置,在代码中也要引入#in
ffmpeg + SDL2 实现播放器(一) 使用的ffmpeg版本为5.0.1,SDL的版本为2.022。c++环境为vs2017。先上最简易的整体代码,初步实现了SDL和ffmpeg的结合。#include<iostream>#include<string.h>#include<SDL.h>extern "C"{#include "libavformat/avformat.h" //头文件不仅要在项目中鼠标点击配置,在代码中也要引入#include "include/libavformat/
SDL2画面刷新 学会SDL的事件与渲染机制之后,增加画面刷新机制就可以成为一个播放器了。在上一篇文章中讲过,似乎循环执行SDL_RenderPresent(renderer)就可以令视频逐帧播放了,为什么还要引入刷新机制呢?这是因为在一个循环中,重复执行一个函数的效果通常不是周期性的,因为每次加载和处理的数据所消耗的时间是不固定的,因此单纯地在一个循环中使用SDL_RenderPresent(renderer)会令视频播放产生帧率跳动的情况。因此需要引入一个定期刷新机制,令视频的播放有一个固定的帧率。通常使用多
SDL2的渲染 使用SDL2播放视频时需要通过渲染操作令视频的每一帧在窗口的显示。SDL播放视频的流程如下图所示:初始化组件:SDL_Init(); //初始化SDLSDL_CreateWindow(); //创建播放器的窗口SDL_CreateRenderer(); //创建基于窗口的渲染器SDL_CreateTexture(); //创建基于渲染器与视频格式的纹理循环渲染:SDL_UpdateTexture(); //设置纹理的数据SDL_Rende
SDL2播放yuv视频文件与事件(event) 1.整体代码先上代码:#include <stdio.h>#include <string.h>#include <SDL.h>//自定义消息类型#define REFRESH_EVENT (SDL_USEREVENT + 1) // 请求画面刷新事件#define QUIT_EVENT (SDL_USEREVENT + 2) // 退出事件//定义分辨率// YUV像素分辨率#define YUV_WIDTH
使用ffmpeg指令转换出yuv视频文件 播放器播放的都是经过解码后的视频,也就是yuv格式的视频文件,因此在学习的过程中需要准备一下yuv格式的视频做实验素材,这里演示如何在电脑中使用ffmpeg指令将一个视频文件转换为.yuv格式。1.打开视频文件路径下的shell视频文件一般存放在电脑中任何位置里,因此需要将shell定位到该路径下才能使用命令行。在视频所在的文件夹里按住shift键右键单击空白处,选择“在此处打开powershell窗口”,这样shell就定位到当前位置了。2.使用ffmpeg指令以该文件下的ds
vs配置SDL2.0 这里记录下在vs2017配置SDL2.0。1.下载源文件下载地址如下图所示,注意需要下载visual c++对应的版本。2.解压将文件夹存放在一个不包含中文路径的地方,解压,注意文件夹中只有include文件夹和lib文件夹是我们需要的。3.新建一个vc++项目注意我们使用的版本是x64的,因此在配置过程中所看到的一切“x86”的东西都要改成“x64”。4.右键单击左侧管理器的项目名称(“SDL2Test”),选择属性,进行配置。平台的类型要改成x64..
ffmpeg读取packet数据 在ffmpeg中,使用AVPacket结构体表示视频文件中的压缩数据,也就是还未进行解压缩的原始视频帧与音频帧。整体代码如下:#include<iostream>#define __STDC_CONSTANT_MACROSextern "C"{#include "libavcodec/avcodec.h"#include "include/libavformat/avformat.h"#include "include/libswscale/swscale.h"#incl