自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 Android camera的metadata

先看一下metadata内部是什么样子:可以看出,metadata 内部是一块连续的内存空间。其内存分布大致可概括为:区域一 :存 camera_metadata_t 结构体定义,占用内存 96 Byte区域二 :保留区,供未来使用区域三 :序号为 0 ~ entry_count-1 的区域四 :剩余未使用的 Tag 结构体的内存保留,该区域大小为(entry_capacity – entry_count)个区域五 :所有 Tag 对应的具体 metadata 数据。

2023-12-14 14:46:22 1109 1

原创 安卓手机上的软件的安装

2.如果是adb版本过低,可以尝试重新安装adb:sudo apt install adb 或者sudo apt update。二、在adb链接上手机之后,使用adb install "软件包绝对路径“ 进行软件的安装。之后在手机中,或者直接在linux下用scrcpy进行找到文件管理中的安装包进行安装即可。这里的scrcpy是需要下载的,如果下载后执行scrcpy命令报错,需要修改分辨率。1.如果adb shell进入后发现可以连上,那就说明手机已经链接上了。本文主要介绍以下怎么在adb下安装软件。

2023-12-13 15:04:18 476

原创 刷机操作小记

7.但是这个LOG是所有的系统LOG,需要grep 具体的,例如相机就grep -i camx就可以找出所有跟相机有关的LOG。6.adb shell logcat 这个命令可以抓出log,我们使用输出重定向 > 到一个文件中,例如 main.log。3.之后进行开机,可以设置自动开机程序,当然也可以手动开机,具体接线如下图(焊口和箭头所指电源)5.在lsusb和adb devices中发现了设备的连接成功后,就可以进行adb命令的使用了。这样在当前目录下面就有一个main.log中显示出了所有的LOG。

2023-12-07 17:30:59 456

原创 MTK Camera2 的OPEN API流程认知

再了解Camera的open api调用之前我们,需要了解Camera的架构,这样才能提高阅读代码的效率。

2023-11-14 11:08:20 301

原创 Camera初步概念认知

CameraManager:系统服务,所有摄像头设备的管理者,我们可以通过它去获得Camera设备对象。CameraDevice:一个CameraDevice对应一个摄像头设备。其中的StateCallback是成功打开了摄像头的回调。CameraCharacteristics:它是系CameraDevice的属性描述类。CameraCaptureSession:系统与摄像头之间的会话,通过CameraDevice创建。其中的StateCallback是session创建成功后的回调。CaptureCall

2023-11-03 12:51:20 206

原创 网络编程2

把父进程该做的事给加入,让它处理服务任务:这样一来就完成了多进程版本的TCP服务器的编写.

2023-10-24 01:09:53 51

原创 UDP代码的改写

我们的echo程序是可以让所有的客户端都能看到自己的发的消息,接下来我们设计一个服务器可以让所有人都看到每个人发的消息,也就是设计一个聊天室.注意,由于这是个单线程的代码,所以如果有客户端使用了类似于top,man这种指令,那就会卡住(因为这一类指令是一直存在的)按流程来,先给一个缓冲区,用来获得读取到的数据,在创建一个sockaddr_in用来记录是谁发数据给我的.4.对于聊天室中的用户,他需要"能在发消息的同时接收消息",因此客户端必然是多线程的.这就是服务器中的"分析和处理数据"一栏的任务了.

2023-10-15 19:49:27 65

原创 网络编程1

当正确格式启动了服务端程序,我们直接服务端上new一个UdpServer对象.以输入的port(注意port在agrv上是char*类型,需要吧字符串类型转换为整型,这里有很多方法,我们直接调用atio函数)和ip来初始化它,用指针svr指向它.其实就是许多计算机连在一起.在中学上课时,我们学校的微机房就是将多台计算机连在一起的具体表现(有很多线连在了一起,同一个局域网内的主机能直接相互通信),而在生活中我们所用的网络,其实就是交换器和路由器把许多相隔千里的计算机连在一起了.

2023-10-15 01:36:56 57

原创 用于替代malloc和free功能的高并发内存池

定长内存池在申请定长的内存时,其效率是非常高的,但是由于它只能申请定长的内存,所以其使用还是受到了一定的限制,另外,对于内存碎片的问题,它也没有相应的应对措施.除此以外,在多线程并发的场景下,锁竞争太过于激烈,效率太低.

2023-10-11 21:58:13 239

原创 基础IO与文件系统

为什么要有库?答:站在巨人的肩膀上,站在使用者的角度,库的存在可以大大减少我们开发的周期,提高软件本身的质量。站在写库的人的角度,用动静态的形式给别人这中方式是比较简单的,而且还能在保护代码安全的情况下给别人用。

2023-09-11 18:15:32 115

原创 Linux进程控制

函数名参数格式是否自带路径是否使用当前环境变量execl列表 (有l)不是 (没有p)是 (没有e)execlp列表 (有l)是 (有p)是(没有e)execle列表 (有l)不是(没有p)不是(有e)execv数组(有v)不是(没有p)是(没有e)execvp数组(有v)是(有p)不是(有e)execve数组(有v)不是(没有p)不是(有e)总结:第一个参数由是否有p来决定是否要写绝对路径(有p就不用写)

2023-09-10 14:55:31 153

原创 Linux进程概念

操作系统包括了内核(进程管理、内存管理、文件管理、驱动管理)和函数库、shell程序等其他程序。操作系统本质是一个基本的程序集合,也就是说,操作系统是与硬件交互,管理所有软硬件资源的软件,从而为用户程序(应用程序)提供一个良好的执行环境。注意:关于管理1.管理者只要拿到被管理者的数据,就可以管理了,并不一定要直接与被管理者接触(校长(OS)、辅导员、我)2.管理就是先描述(类对象)、后组织(对数据结构的操作)

2023-09-05 20:24:27 81

原创 Linux环境基础开发工具

问:要下载安装的软件实在我的电脑上的吗?如果不是那优势如何知道的呢?答:要下载安装的东西肯定是不在我的电脑上的,我不知道它在哪但肯定有人知道,是由它内部的工作人员将他放在服务器上的供我来去下载的。我们下载的软件,其实就相当于在手机上下载东西,是提前有人给放在服务器上的,我们则需要到应用市场上才能去找到软件安装包来进行下载安装。这里 我们就可以发现 yum和应用市场类似 ,能够自动获得下载路径所谓的版本控制,其实就是在修改出新版的同时,保留旧版。

2023-09-01 01:52:17 123

原创 Linux常见指令以及权限理解

创建一个新文件。

2023-08-13 23:48:39 233

原创 C++11

目录一、统一的列表初始化1.{}初始化2.初始化链表 initializer_list 二、声明的简化1.auto关键字2.decltype3.nullptr 三、右值引用 1.左值引用和右值引用的概念2.左值引用和右值引用的比较3.右值引用的使用场景和意义四、完美转发五、新的类默认成员函数C++11 新增了两个:移动构造函数和移动赋值运算符重载。 强制生成默认成员函数的关键字 default禁止生成默认成员函数的关键词delete六、可变参数模板七、lambda表达式 1.lambda表达式的使用场景 2

2023-07-09 18:06:23 56

原创 二叉搜索树的平衡处理——红黑树

红黑树,是一种二叉搜索树,红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树和AVL树的区别:红黑树:最长路径不超过最短路径的两倍(近似平衡)AVL树:左右子树高度差不大于一(严格平衡)相对而言,插入同样的数据,AVL树旋转的更多,红黑树则旋转的少。

2023-06-10 18:28:26 82 1

原创 二叉搜索树的平衡处理——AVL树

二叉搜索树虽然可以缩短查找的效率,但是如果数据有序或者接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率非常低下。当向二叉搜索树中插入新的节点之后,如果能保证每个节点的左右子树高度差不超过1(需要对数中的节点进行调整),即可降低树的高度,从而减少平均搜索长度。a、它的左右子树都是AVL树b、左右子树高度之差(平衡因子)的绝对值不超过1如果一颗二叉搜索树是高度平衡的,他就是AVL树。如果它拥有n个节点,其高度可以保持在logN,那么搜索的时间复杂度也就是O(logN)。

2023-06-03 20:43:04 164

原创 底层以红黑树实现的map和set

set是Key模型,1.set中(为了和map对应),也存的是pair键值对,只不过key和value的值相等,并且每个value必须是唯一的。sre中的元素不能在容器中修改(每个元素都是const),但是可以删除或者插入元素。2.在内部,set中的元素总是按照其内部比较对象(仿函数)所指示的特点比较准则进行排序的。3.set容器通过key访问单个元素的速度常常比unordered_set容器慢(哈希),但支持迭代器访问。4.set在底层是使用红黑树实现的。注意。

2023-06-03 15:47:36 441

原创 二叉树进阶

给一个单词,判断这个单词在文章中出现了几次,就可以把文章中所有单词全存到一颗KV模型的二叉搜索树中,其中单词每出现一次就在键值对<word,count>中把其对应的count++,之后在树中根据word就能知道对应的count的值。对于有n个节点的二叉搜索树,如果每个元素被查找的概率相等,则二叉搜索树平均查找长度是节点在二叉搜索树的深度的函数,即节点越深,则比较次数越多(高度越高,比较次数越多)。和root比较,比root大就向右下移动,比root小就向左下移动,直至空位置,到了空位置就直接赋值给该位置。

2023-06-03 10:13:14 51

原创 多态——不同对象完成某个行为会产生不同的状态

多态实在不同继承关系的类对象去调用同一个函数产生不同行为例如Student继承了Person,Person买票是全价,Student类中买票就是半价在继承中,构成多态要满足这两个条件:1.必须通过基类的指针或者引用(这个指针指向谁调用谁:例如:A* p = new B,在p中调用虚函数的时候还是调用B类中的)调用虚函数2.被调用的函数必须是虚函数,并且派生类必须对基类的虚函数进行重写重载:1.两个函数在同一个作用域 2.函数名相同、函数参数不同(个数、类型、顺序)

2023-05-27 16:39:52 110

原创 继承——体现的是类设计层次的复用

方法1:父类构造函数私有化 —— 在子类中就不可见了,那么在子类对象实例化的时候就无法调用构造函数。方法2.在C++11中,有final关键字来修饰父类,意为不可继承//...此时如果来个class B :public A 会报错1.很多人说C++语法复杂,其实继承就是一个体现。有了多继承,就有了菱形继承,就有菱形虚拟继承。底层实现就很复杂,所以一般不建议设计出多继承,一定不要设计出菱形继承,太过于复杂了。2.多继承其实算是C++的一个坑,后面很多语言都优化掉了多继承(例如Java就不支持多继承)

2023-05-24 23:02:09 115

原创 模板补充和总结

模板参数分为类型模板参数和非类型模板参数。:出现在模板参数列表中,跟在class或者typename之类后面的参数类型名称:用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用这里的N就是非类型模板参数1.。2.。

2023-05-23 19:13:53 39

原创 反向迭代器

对于list而言,end()即是哨兵位头节点的位置。为了在使用rbegin()和rend()时也有这样的特性,我们将它们设在了这样的位置:我们可以看到这里。

2023-05-19 15:06:48 206

原创 STL——stack和queue

1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作back:获取尾部元素操作。

2023-05-19 01:19:18 168

原创 STL——list

一、list介绍1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。(双向循环链表)2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

2023-05-18 01:02:09 98

原创 STL——vector

template< class T,class Alloc = allocator空间配置器(内存池)1.vector是表示大小可以更改的序列容器。2.就像数组一样,vector也采用存储空间来存储元素。也就是意味着可以采用对vector的元素进行访问,和数组一样高效。但是又不像数组,它的的,而且它的大小会被容器自动处理。3.从本质讲,vector使用。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组(new),然后将全部元素移到这个数组。

2023-05-16 00:50:15 35

原创 STL ——String

1.字符串是表示字符序列的类2.该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。3. string在底层实际是:basic_string模板类的别名:4. 不能操作多字节或者变长字符的序列对于String类模板,其实也有其他的例如宽字符串、16/32位字符串,其作用是为了支持各国得字符实现。B.String常用接口1.构造string() (重点)构造空的string类对象,即空字符串(重点)用C-string(字符串)来构造string。

2023-05-13 02:15:40 80

原创 C/C++内存管理及模板

但是切记不可使用struct。

2023-05-06 02:15:14 61

原创 类和对象再回顾

(其实自定义类型的成员推荐都用初始化列表初始化,因为无论你是否在初始化列表中初始化它,它都会走一遍初始化列表)

2023-05-04 21:51:46 39

原创 类的成员函数

目录一.构造函数二.析构函数四.拷贝构造函数四.赋值运算符重载对于一个空的类,编译器还是会在里面生成6个默认成员函数的。 在学习这些默认成员函数的时候要切记不能以普通函数的定义和调用规则去理解它们。虽然叫做“构造”函数,但是它并不会定义,只能够初始化(个人认为其实叫做初始化函数更为合理一点)。 特征:举个例子:构造函数的应用价值:上面这个栈要传参还要初始化一个st就很烦,可以直接全缺省构造函数。不是的,C++把类型分为内置类型和自定义类型: 而默认构造函数的作用是:不管内置类型,调用类型体内的自定义类

2023-05-04 02:27:01 737

原创 类和对象

class Name——>类的名字//...成员函数和成员变量//注意这里和struct一样需要;class 为类的关键词类体中的内容称为:类的成员类中的变量称为类的属性或成员变量类中的函数称为类的方法或成员函数类有两种定义方式:1.声明和定义全部放在类体中但是要注意:成员函数如果在类中定义,编译器可以能会将其当成内联函数处理。public:void ShowInfo()//成员函数在类体中声明并且定义char* _sex;int _age;

2023-05-01 20:56:08 45

原创 C++入门(2/2)

否则会导致。

2023-05-01 02:02:49 150

原创 C++入门(1/2)

命名空间,缺省参数,函数重载,引用

2023-04-28 23:49:02 79

原创 七大排序:插入、希尔、选择、冒泡、堆、快速、归并

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。例如:2 1 5 4 3667 8如果排序之后两个6的顺序不变那么这个排序就是稳定的 反之就是不稳定的:数据元素全部放在内存中的排序。

2023-04-26 00:38:30 71

原创 二叉树OJ练习

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。思路:用递归来看,先排除特殊情况-》根为空,然后遍历,递归判断,将每次的false和right记录,最后一起返回,如果有一个false就是false。

2023-04-22 01:55:06 53

原创 二叉树链式结构的实现

思路:二叉树的深度是由他最深的一个子树决定的,那么我们在递归求深度时就要考虑到这一点,设置这一条件,求出左子树的深度和右子树的深度,最后返回较深的深度。转换成子问题:求左子树的k-1层和右子树的k-1层的和,一直找左子树和右子树下去,直到左子树和右子树层数为一为止。思路:想要求叶节点的个数,就需要在每个叶节点的位置计数,用递归找到所有叶节点即可,直到NULL为止。问题,能想到的最简单直接的方式就是排序,但是:如果数据量非常大,排序就不太可取了。总结:今天只是二叉树的开头,个人认为不算难,难啃的还在后面。

2023-04-21 01:05:10 68

原创 二叉树和堆初识

对于深度为K的、有n个结点的二叉树,当且仅当其每一个节点都与深度为K的满二叉树中编号从1至n的结点一一对 应时称之为完全二叉树。:一个二叉树,如果每一个层的节点数都达到最大值,则这个二叉树就是满二叉树。完全二叉树的顺序存储方式存储,并且父节点永远比子节点大(或者永远比子节点小)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。:以某节点为根的子树中任一节点都称为该节点的子孙。:若一个节点含有子节点,则这个节点称为其子节点的父节点;:一个节点含有的子树的根节点称为该节点的子节点;

2023-04-19 01:05:49 62

原创 栈和队列理解

总结:栈和队列这部分的实现相对于前面的链表和顺序表来说是比较容易的,所以这里我没有做过多的思路的赘述,但是栈和队列这边也是有很多经典的OJ题的,这几天实习有点忙,我已经基本全部做了一遍,但是自身还是没有深刻的理解,所以明天或者后天抽出一天有空来进行OJ题的一个专栏的博客记录,加油!队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出。

2023-04-18 00:59:58 51

原创 单向链表以及双向链表

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深度拷贝。给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。深拷贝应该正好由 n 个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。

2023-04-17 00:55:55 87

原创 链表问题处理

现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。方法1:从第一个链表的第一个节点开始,拿它和另外一个链表的所有节点比较,如果都不相同,那就往后走,这个方法的时间复杂度为O(N的平方),效率低下。给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点。新链表是通过拼接给定的两个链表的所有节点组成的。

2023-04-16 09:21:07 254

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除