- 博客(286)
- 资源 (2)
- 问答 (3)
- 收藏
- 关注
原创 Android JNI浅析、Java和Native通信对象的传值和回调
JNI是一个本地编程接口,它允许运行在Java虚拟机的Java代码与用其他语言(如C,C++和汇编)编写的库交互。
2023-03-08 16:21:36
1195
1
原创 一文读懂MP4封装格式
MP4或称MPEG-4第14部分(MPEG-4 Part 14)是一种标准的数字多媒体容器格式。扩展名为.mp4。虽然被官方标准定义的唯一扩展名是.mp4.mp4.m4a大部分数据可以通过专用数据流嵌入到MP4文件中,因此MP4文件中包含了一个单独的用于存储流信息的轨道。
2022-11-15 15:11:54
2489
原创 C++11:互斥锁std::mutex和std::lock_guard/std::unique_lock
C++11中新增了std::mutex,它是C++标准程序库中的一个头文件,定义了C++11标准中的一些互斥访问的类与方法等。mutex是ualclusion(互斥)的简写。
2022-10-24 15:58:49
2799
原创 C++11:移动语义Move Semantics和完美转发Perfect Forwarding
关于右值引用的说明,我们在上一篇文章中已经通过具体的例子来了解了!那么它到底有什么用?我这里引用一下一篇2006年非常经典的论文的原文:!推荐大家阅读一下!这里简单翻译一下就是:事实证明,右值引用和左值引用的组合正是轻松编码移动语义所需要的。右值引用也可用于实现完美转发,这是 C++ 中迄今为止未解决的问题。从普通程序员的角度来看,我们从右值引用中得到的是更通用、性能更好的库。
2022-10-09 16:44:24
446
转载 C++11:左值、右值、左值引用、右值引用有什么区别?
能够取地址,有名字的值就是左值编译器允许我们对左值建立引用,但不允许对右值建立引用。也就是说常量左值引用即可以操作左值,也可以操作右值。举个例子:int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该变量的地址;表达式b+c、函数int fun()的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名找到它,&(b+c)这样的操作则不会通过编译。但这种定义出来的右值引用并无实际用处:一方面,右值引用主要用于移动语义和完美转发,其中需要有修改右值的权限;
2022-10-09 11:45:09
254
原创 OpenGL进阶(三)之混合Blending
OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术。透明就是说一个物体(或者其中的一部分)不是纯色(Solid Color)的,它的颜色是物体本身的颜色和它背后其它物体的颜色的不同强度结合。透明的物体可以是完全透明的(让所有的颜色穿过),或者是半透明的(它让颜色通过,同时也会显示自身的颜色)。一个物体的透明度是通过它颜色的alpha值来决定的。Alpha颜色值是颜色向量的第四个分量。alpha1.0–>物体不透明alpha0.0–>物体完全透明。
2022-09-22 21:45:00
469
原创 浅谈Android OOM及定位分析
要定位OOM问题,首先需要弄明白Android中有哪些原因会导致OOM,Android中导致OOM的原因主要可以划分为以下几个类型:Android 虚拟机最终抛出OutOfMemoryError的代码位于/art/runtime/thread.cc。下面两个地方都会调用上面方法抛出OutOfMemoryError错误,这也是Android中发生OOM的主要原因。
2022-09-22 15:06:57
1803
转载 JNI内存方面说明以及相关类型手动释放内存
它的生命期是在Native Method的执行期开始创建(从Java代码切换到Native代码环境时,或者在Native Method执行时调用JNI函数时),在Native Method执行完毕切换回Java代码时,所有Local Reference被删除(GC会回收其内存),生命期结束(调用。注意Local Reference的生命周期,如果在Native中需要长时间持有一个Java对象,就不能使用将jobject存储在Native,否则在下次使用的时候,即使同一个线程调用,也将会无法使用。
2022-09-19 20:56:57
722
原创 OpenGL进阶(二)之像素缓冲PixelBuffer
PBO(Pixel Buffer Object)非常类似VBO,以便于将顶点数据和像素数据存储到缓冲对象中,这种存储像素数据的缓冲区对象称为像素缓冲区对象 (PBO)。另外,添加了2个额外的“目标”标志。系统内存,共享内存或者显存。用于将像素数据传送到PBO,或者将PBO传输到像素数据。举个例子,和是“打包(pack)”像素操作, 而,和是“解压(unpack)”操作.当一个PBO绑定到标志上时,
2022-09-19 15:35:19
1438
原创 FFPlay播放pcm和yuv帧数据
各个参数:-ar 表示采样率-ac 表示音频通道数单声道是 1,Android 中为 AudioFormat.CHANNEL_IN_MONO双声道是 2,Android 中为 AudioFormat.CHANNEL_IN_STEREO-f 表示 pcm 格式,sample_fmts + le(小端)或者 be(大端)sample_fmts可以通过ffplay -sample_fmts来查询-i 表示输入文件,这里就是 pcm 文件。
2022-09-07 12:06:45
1601
原创 OpenGL进阶(一)之帧缓冲FrameBuffer
帧缓冲(Framebuffer),它被储存在显存中,包括:用于写入颜色值的、用于写入深度信息的和允许我们根据一些条件丢弃特定片段的。我们目前在前边入门文章中所做的所有操作都是在的渲染缓冲上进行的。默认的帧缓冲是在你创建窗口的时候生成和配置的(GLFW帮我们做了这些)!由于我们的帧缓冲不是默认帧缓冲,渲染指令将不会对窗口的视觉输出有任何影响,这个过程也被称为。
2022-09-06 22:26:09
2733
原创 OpenGL入门(五)之Matrix矩阵操作和坐标系统
为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。我们的顶点坐标起始于局部空间(Local Space),在这里它称为局部坐标(Local Coordinate),它在之后会变为世界坐标(World Coordinate),观察坐标(View Coordinate),裁剪坐标(Clip Coordinate),并最后以屏幕坐标(Screen Coordinate)的形式结束。
2022-09-05 17:28:39
1493
原创 OpenGL入门(四)之纹理Texture
纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节!我们可以在一张图片上插入非常多的细节,这样就可以让物体非常精细而不用指定额外的顶点,来减小开销!为了能够把纹理映射(Map)到三角形上,我们需要指定三角形的每个顶点各自对应纹理的哪个部分。这样每个顶点就会关联着一个纹理坐标(Texture Coordinate),用来标明该从纹理图像的哪个部分采样(采集片段颜色)。之后在图形的其它片段上进行片段插值(Fragment Interpolation)。
2022-09-02 18:59:43
2416
原创 OpenGL入门(三)之着色器Shader
GLSL(OpenGL Shder Language):OpenGL着色器语言,用于写Shader的语言。GLSL是为图形计算量身定制的,它包含一些针对向量和矩阵操作的有用特性。特别的对于来说,每个输入变量也叫!我们可以查询当前支持的属性个数!一般来说都是16个!
2022-09-01 17:57:39
1659
原创 OpenGL入门(二)之渲染管线pipeline,VAO、VBO和EBO
在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(Graphics Pipeline,大多译为管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程)管理的。图形渲染管线可以被划分为两个主要部分:第一部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际的有颜色的像素。图形渲染管线可以被划分为几个阶段,每个阶段将会把前一个阶段的输出作为输入。.........
2022-08-29 20:16:48
1149
原创 OpenGL入门(一)之认识OpenGL和创建Window
OpenGL是一个由Khronos组织制定并维护的规范(Specification),供我们访问GPU资源,OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值,具体函数实现由各大显卡厂商提供!
2022-08-25 17:39:46
979
转载 Android 获取位置信息
获取经纬度后在地图上查询发现,位置存在一定偏移,这个是因为使用的坐标系不一致引起的。我国出于国家安全的考虑,会将所有的电子地图经行加偏处理,由真实的地理坐标系又称地球坐标系(WGS84)转换为火星坐标系(GCJ02),但是使用 location 获取的经纬度又是WGS84坐标系的,所以再其他地图上显示会出现位置偏移现象。目前坐标系主要有以下几种:WGS84坐标系:地球坐标系,国际通用坐标系GCJ02坐标系:火星坐标系,WGS84坐标系加密后的坐标系,Google国内地图、高德、QQ地图使用。...
2022-08-17 18:07:16
4129
1
转载 介绍一种性能较好的 Android native unwind 技术
设计实现 QUT 的初衷是希望在 32 位环境下通过 hook 监控某些资源使用的调用栈,过程中察觉到 libunwindstack 的性能问题也发现基于异常处理的回溯有不少的改善空间。业界也有人提出类似的思路,比如 Reliable and Fast DWARF-Based Stack Unwinding 这篇论文 [12] 就描述了精简回溯过程后直接生成机器码的技术,有很大参考意义。...
2022-08-15 11:22:51
1139
转载 使用GAPID报错Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS
本文转自:https://blog.csdn.net/zzwfd/article/details/104005744在使用GAPID点击start的时候,报错:Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS找到一篇文章:https://blog.csdn.net/zzwfd/article/details/104005744解决了这个问题!小米:在开发者选项里,把“USB调试(
2022-06-10 14:14:24
767
转载 Android消息总线的演进之路:用LiveDataBus替代RxBus、EventBus
本文转自:美团技术团队 https://tech.meituan.com/2018/07/26/android-livedatabus.html背景对于Android系统来说,消息传递是最基本的组件,每一个App内的不同页面,不同组件都在进行消息传递。消息传递既可以用于Android四大组件之间的通信,也可用于异步线程和主线程之间的通信。对于Android开发者来说,经常使用的消息传递方式有很多种,从最早使用的Handler、BroadcastReceiver、接口回调,到近几年流行的通信总线类框架Ev
2022-05-26 21:10:33
1102
原创 Android 11中对于64位应用arm执行MTE导致crash的问题
前言App 64位包在Android 11上crash,崩溃堆栈也很诡异,报了一个native的空指针,代码中一个函数参数为int64_t类型的指针,并且确定不为空!分析在仔细调试时,发现函数中传入的指针地址,和使用时的指针地址不一致,从而导致空指针,但是奇怪的是32位的包就没有这个问题!在查阅了一些资料,发现是由于Android 11中对于64位的进程,arm v9 cpu启用了MTE( Memory Tagging Extension,内存标记拓展)功能。MTE 的工作原理是对堆栈、堆和全局变量
2022-04-20 11:07:33
874
转载 ANR机制以及问题分析
本文转自:https://duanqz.github.io/2015-10-12-ANR-Analysis1. 概览ANR(Application Not Responding),应用程序无响应,简单一个定义,却涵盖了很多Android系统的设计思想。首先,ANR属于应用程序的范畴,这不同于SNR(System Not Respoding),SNR反映的问题是系统进程(system_server)失去了响应能力,而ANR明确将问题圈定在应用程序。 SNR由Watchdog机制保证,具体可以查阅Watc
2022-04-01 11:09:29
932
转载 ANR问题简析
本文转自:https://blog.csdn.net/qzh123456/article/details/78737791前言ANR问题,相信是每位开发日常都会遇到的问题,对于这类问题的分析,按照官方的推荐,或网络博客的总结思路能解决一定的问题,但是多数时候大家的困惑就是应用本逻辑很简单,耗时很短或应用堆栈完全正常,或者或处于空闲状态,可系统为什么就认为接收者发生ANR了呢?下面将之前公司的一次内部分享开放出来,用几个实例从不同角度分析导致ANR产生的Root Case。也希望对大家以后分析该类问题有一
2022-03-31 18:17:46
1499
原创 C/C++ 宏拼接和宏展开为字符串
前言有一个需求是将一个宏和一个字符串拼接,然后在代码中拿到这个字符串,记录一下。方案首先,我们知道非常常见的一个宏的拼接和展示字符串的宏定义:#define CONTACT(x,y) x##y //拼接#define STR(x) #x //转字符串这种宏定义在开发中是很常见的!但是,如果上边我们那个需求中,让一个字符串和一个宏的值进行拼接的话,纯粹使用上边的宏就不行了,这里我们要使用二级的宏,这样才能拼接到宏的值://二级#define CONTACT2(x,y) CONTAC
2022-03-14 20:13:35
10540
转载 INSTALL_FAILED_TEST_ONLY的原因及解决方案
本文转自:https://blog.csdn.net/vfush/article/details/80320596前言有一天给测试同学打了个deubg 包发现无法安装,提示无法解析,使用adb install 安装后提示INSTALL_FAILED_TEST_ONLY,原来是Android Studio 3.0会在debug apk的manifest文件application标签里自动添加 android:testOnly="true"属性问题在Android Studio进行开发的时候,生成的de
2022-03-01 16:44:36
5225
1
原创 C/C++使用dlopen手动加载动态so库
前言类似于Java中System.load()和System.loadLibrary(),在native层就是通过dlopen打开,然后dlsym去获取函数或者变量的符号。手动加载C中动态加载举个例子,在c中打开x264的一个函数:#include <x264.h>#include <dlfcn.h>typedef int (*x264_encoder_encode_func)(x264_t *, x264_nal_t **pp_nal, in
2022-03-01 15:33:01
2578
原创 C/C++ “undefined reference to XXX“问题总结
这里看到一篇总结非常全面的文章,记录一下:"undefined reference to XXX"问题总结
2022-02-28 16:08:15
1069
翻译 了解速率控制模式Rate Control Mode-CBR,VBR,CRF(x264、x265、vpx)
声明:本文为Understanding Rate Control Modes (x264, x265, vpx)的译文。什么是“速率控制”?这是视频编码器在决定为给定帧花费多少比特时所做的事情。(有损)视频编码的目标是尽可能多地保存比特,减少原始输入文件的文件大小,同时保持尽可能多的质量。速率控制是确定尺寸和质量之间权衡的关键步骤。速率控制有多种形式——你会认识术语“1-pass”和“2-pass”、“CBR”和“VBR”,也许你知道“VBV Encoding”或“CRF”。你为什么需要关心?您经常会
2022-02-09 18:08:19
3593
原创 H.264编解码浅析
声明:本文是阅读《新一代视频压缩标准H.264_AVC》笔记总结简介H.264,又称为MPEG-4第10部分,高级视频编码(英语:MPEG-4 Part 10, Advanced Video Coding,缩写为MPEG-4 AVC)是一种面向块,基于运动补偿的视频编码标准。视频压缩预测编码帧内预测解决空间冗余,因为一帧的图片相邻位置的像素点一般是相似的,突变概率较小。帧间预测解决时间冗余,因为相邻帧的图片一般只是个别像素的移动改变。变换编码视频信号中包含大量的直流和低频部分,还有少量高
2022-01-20 12:14:33
2846
转载 CMake构建类型和编译选项
本文转自:https://hijk.tech/cmake-tutorial/05/构建类型构建类型(Build Type)指的是编译构建一个代码工程时采用的配置。对于使用IDE的工程,一般可以在IDE内的选项上修改构建类型,例如Visual Studio工程中的Configuration,默认分为Debug和Release,在每次编译前可以选择使用哪一种。但对于命令行式的构建系统,一般需要自己调整makefile中的编译选项,来实现不同的构建类型。使用cmake可以不必手动修改编译选项,能够方便的切换构
2021-12-17 18:43:01
2505
原创 FFmpeg结构体学习(一):AVFormatContext分析
前言统领全局的基本结构体,包含码流参数较多。它的源码位于libavformat/avformat.h。源码/** * Format I/O context. I/O格式上下文 * sizeof(AVFormatContext) must not be used outside libav*, use * avformat_alloc_context() to create an AVFormatContext. * * Fields can be accessed through AVOp
2021-11-19 17:27:52
1819
转载 FFmpeg DTS、PTS和时间戳TIME_BASE详解
本文转自:https://www.cnblogs.com/leisure_chn/p/10584910.html1. I 帧/P 帧/B 帧I 帧:I 帧(Intra-coded picture, 帧内编码帧,常称为关键帧)包含一幅完整的图像信息,属于帧内编码图像,不含运动矢量,在解码时不需要参考其他帧图像。因此在 I 帧图像处可以切换频道,而不会导致图像丢失或无法解码。I 帧图像用于阻止误差的累积和扩散。在闭合式 GOP 中,每个 GOP 的第一个帧一定是 I 帧,且当前 GOP 的数据不会参考前后
2021-11-09 16:50:06
7659
原创 C/C++链接过程、动态链接库.so和静态链接库.a
前言个人总结动态链接库静态链接库符号表strip不strip查看符号表1.使用objdump命令。objdump -tT xxx.so2.使用nm命令(个人觉得使用nm方式查看更方便。)nm -D xxx.so# -D或-dynamic选项表示:显示动态符号。该选项仅对于动态库有意义)得到的结果中以T开头的就是导出函数android中可以使用NDK下的工具:目录在NDK/android-ndk-r21b/toolchains/aarch64-linux-android-4.
2021-10-29 17:10:32
2502
原创 C++11:智能指针
RAIIRAII,全称资源获取即初始化(英语:Resource Acquisition Is Initialization)。RAII要求,资源的有效期与持有资源的对象的生命期严格绑定,即由对象的构造函数完成资源的分配(获取),同时由析构函数完成资源的释放。在这种要求下,只要对象能正确地析构,就不会出现资源泄露问题。传统 C++ 中,『记得』手动释放资源,总不是最佳实践。因为我们很有可能就忘记了去释放资源而导致泄露。 而 C++11 引入了智能指针的概念,使用了引用计数的想法,让程序员不再需要关心手动
2021-08-19 17:24:53
634
原创 C++11:Lambda表达式
声明Lambda表达式完整的声明格式如下:[capture list] (params list) mutable exception-> return type { function body }各项具体含义如下capture list:捕获外部变量列表params list:形参列表mutable指示符:用来说用是否可以修改捕获的变量exception:异常设定return type:返回类型function body:函数体但是并不是所有的项都必须写全,可以省略一些不需
2021-08-17 20:43:09
227
转载 C++:标准转换运算符reinterpret_cast
转自:https://www.cnblogs.com/ider/archive/2011/07/30/cpp_cast_operator_part3.html另外系列文章part1,part2,part4,part5对其他几种转换const_cast,static_cast,dynamic_cast都有较清晰深入的讲解!收藏一下!语法reinterpret_cast <new_type> (expression)介绍reinterpret_cast运算符是用来处理无关类型之间的转换;
2021-08-16 15:51:15
357
Webkit在加载派生资源
2016-10-14
webview显示别的平面的字体该如何做?
2016-04-25
Android SwipeRefreshLayout加载颜色不会显示!!!!!
2016-04-14
TA创建的收藏夹 TA关注的收藏夹
TA关注的人