自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

CSDN爱好者的独到见解

各位程序员,你们好!我是Snasph。 作为CSDN社区的忠实fans,我亲眼见证了集体知识和协作在克服编码障碍方面的力量。无论是调试顽固的代码、优化性能,还是掌握最新技术,我都通过利用你们分享的丰富智慧来磨练自己的技能。 通过这个博客...

  • 博客(48)
  • 资源 (2)
  • 收藏
  • 关注

原创 Ubuntu开启路由转发功能

IP转发允许系统在不同的网络接口之间路由数据包,这对于设置路由器等任务至关重要。下面是在Ubuntu上临时和永久启用IP转发的步骤。

2024-10-25 01:14:10 585

原创 Linux设置开机自启程序

可运行程序。

2024-10-22 16:32:47 392

原创 使用winsock和ip相关指令重置Window网络配置

和是 Windows 中用于修复网络问题的命令。它们分别用于重置 Winsock 和 TCP/IP 网络配置,以解决可能由于配置错误或网络堆栈损坏而导致的网络连接问题。

2024-10-06 15:08:35 786

原创 深入理解Audio系统

根据“frameworks/av/services/audiopolicy/common/include/policy.h”中定义,API调用的采样率的范围是。AudioTrack的构造用了“建造者模式”的方法,创建了一个AudioTrack实例;

2024-05-30 14:50:33 200

原创 03-行为型模式(共10种)

上一篇: 02-结构型设计模式(共7种) 策略模式是一种行为型设计模式,它定义了一系列算法,将每个算法封装到独立的类中,并使它们可以互相替换。这样可以使算法的变化独立于使用算法的客户端。 在 C++ 中,策略模式通常涉及以下几个角色: ①. Strategy(策略接口):定义了所有支持的算法的通用接口。 ②. ConcreteStrategy(具体策略类):实现了策略接口,提供了具体的算法实现。 ③. Context(上下文):维护一个对

2024-05-16 11:41:57 621

原创 02-结构型设计模式(共7种)

适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。这种模式通常用于解决接口不兼容的情况,使得原本由于接口不匹配而无法工作的类可以一起工作。在 C++ 中,适配器模式可以通过类适配器和对象适配器两种方式来实现。

2024-05-15 00:57:17 995

原创 01-基本概念

算法是指解决特定问题或执行特定任务的一组有限步骤的规则或者指令。它是一种对问题进行抽象和描述的方式,能够在计算机或者其他设备上被实现和执行。算法通常包括输入(Input)、处理(Processing)和输出(Output)三个基本部分,它们描述了算法如何接受输入数据、对数据进行处理,并生成输出结果。算法的特点包括:①. 有限性:算法必须由有限个步骤组成,且在有限时间内执行完成。②. 确定性:算法的每一步骤必须精确地定义,没有歧义,不会出现二义性。

2024-05-07 00:33:06 731 1

原创 Android 12中配置Selinux相关权限问题

从avc信息看,需要配置:但如上规则,放在系统里依然无法编译。原因是Google定义了相关规则,不允许按上述方法配置;处理方案是:①. 在文件中新增label,如下图所示;②. 在*.te文件中,通过set_propget_prop方法来配置;编辑/添加策略和file_contexts后,更新 /device/manufacturer/device-name/BoardConfig.mk 以引用 sepolicy 子目录和每个新策略文件。

2024-03-29 17:43:06 774

原创 演示如何使用消息对实现线程同步(C++代码)

这个例子中:①. 定义一个Message结构来保存发送者ID信息和内容的相关信息。②. 全局变量 mtx , cv 和 messageQueue 用于同步。mtx 是变量, cv 是变量,messageQueue 是用于存储消息的队列。③. 线程使用函数发送消息。它锁定互斥项,将消息推入队列,并使用条件变量通知等待的线程。④.函数用于线程接收消息。它使用条件变量等待队列中出现消息。一旦有消息,它就会处理该消息。

2024-03-23 01:28:14 523

原创 epoll API介绍

epoll是一个 Linux 系统调用,用于监控多个文件描述符,查看是否可以在其中任何一个文件描述符上进行 I/O 操作。它常用于网络编程,用于构建可扩展的高效服务器。epoll API 的核心概念是 epoll 实例,它是一种内核数据结构,从用户空间的角度来看,可以将其视为两个列表的容器:兴趣列表): 进程已注册要监控的文件描述符集;就绪列表):"就绪 "可进行 I/O 的文件描述符集合。ready list是“兴趣列表”中文件描述符的子集(或者更准确地说,是一组引用)。

2024-03-22 17:20:26 883

原创 05-调用API

下面的代码示例说明了如何使用调用 API 中的函数。在这个示例中,C++ 代码创建了一个 Java VM 并调用了一个名为 Main.test 的静态方法。为清晰起见,我们省略了错误检查。...本示例使用了 API 中的两个函数。调用 API 允许本地应用程序使用 JNI 接口指针访问虚拟机功能。

2024-03-05 11:20:23 816

原创 04-JNI函数

本章是 JNI 函数的参考章节。它提供了所有 JNI 函数的完整列表。它还介绍了 JNI 函数表的具体布局。注意:使用 "必须 "一词来描述对 JNI 程序员的限制。例如,当你看到某个 JNI 函数必须接收一个非 NULL 对象时,你就有责任确保 NULL 不会传递给该 JNI 函数。因此,JNI 实现无需在该 JNI 函数中执行 NULL 指针检查。在明确不允许的情况下传递 NULL 可能会导致意外异常或致命崩溃。定义为既可返回 NULL 又可在出错时抛出异常的函数,

2024-03-05 11:17:41 956

原创 03-JNI 类型和数据结构

上一篇:本章讨论 JNI 如何将 Java 类型映射为本地 C 类型。

2024-03-02 11:37:39 938

原创 02-设计概述

本章重点讨论 JNI 中的主要设计问题。本节中的大多数设计问题都与本地方法有关。调用 API 的设计将在第 5 章:调用 API 中介绍。

2024-03-02 11:03:59 853

原创 01-导言

虽然可以完全使用 Java 编写应用程序,但在某些情况下,仅使用 Java 无法满足应用程序的需求。程序员使用 JNI 编写 Java 本地方法,以处理应用程序不能完全用 Java 编写的情况。下面的示例说明了何时需要使用 Java 本地方法:①.标准 Java 类库不支持应用程序所需的平台相关功能。②.已经有了一个用其他语言编写的库,希望通过 JNI 使 Java 代码可以访问它。③.想用汇编等低级语言实现一小部分运行效率高的代码。通过 JNI 编程,可以使用本地。

2024-03-01 23:11:44 980

原创 12-输入/输出项目构建命令行程序

测试驱动开发(TDD, test-driven development)是一种软件开发方法,即在实际代码执行之前编写测试。它是一种用于确保所开发的软件满足指定要求的技术,并有助于在开发周期的早期捕捉错误。该过程遵循一个短暂的重复周期,Red-Green-Refactor,即 "红-绿-重构":①. 红色编写一个定义函数或函数改进的测试,该测试最初失败的原因应该是函数不存在或不按预期执行。②. 绿色:编写通过测试所需的最少代码量。这一阶段的主要目标是在遵守指定要求的前提下尽快通过测试。

2024-02-17 21:49:44 1088 1

原创 11-编写自动化测试

作为 assert!和 assert_ne!宏的可选参数,您还可以添加要与失败信息一起打印的自定义信息。在必备参数之后指定的任何参数都将传递给 format!宏(在第 8 章 "使用 + 操作符或 format!宏进行连接 "一节中讨论),因此可以传递包含 {} 占位符和要在这些占位符中使用的值的格式字符串。自定义消息对于记录断言的含义非常有用;当测试失败时,你可以更好地了解代码的问题所在。format!("Hello {}!

2024-02-17 00:43:56 1195

原创 10-通用类型、特质和生命周期

在定义使用泛型的函数时,我们通常会将泛型放在函数签名中指定参数和返回值数据类型的地方。这样做可以使我们的代码更加灵活,为函数的调用者提供更多的功能,同时防止代码重复。继续我们的 largest 函数,清单 10-4 显示了两个函数,它们都能找到切片中的最大值。然后,我们将把这两个函数合并为一个使用泛型的函数。println!清单 10-4:两个仅在名称和签名类型上不同的函数)

2024-02-16 17:47:25 1253

原创 09-错误处理

让我们把使用 Rust 的类型系统来确保我们拥有一个有效值的想法向前推进一步,看看如何创建一个用于验证的自定义类型。回想一下第 2 章中的猜谜游戏,我们的代码要求用户猜一个 1 到 100 之间的数字。在将用户的猜测与我们的秘密数字进行核对之前,我们从未验证过用户的猜测是否介于这两个数字之间;我们只验证了用户的猜测是肯定的。在这种情况下,后果并不严重:我们输出的 "太高 "或 "太低 "仍然是正确的。

2024-02-06 16:18:09 1424

原创 08-常用集合(容器)

我们首先定义一下字符串的含义。Rust 的核心语言中只有一种字符串类型,那就是字符串片str,它的借用形式通常是&str。在第 4 章中,我们谈到了字符串片,它是对存储在其他地方的UTF-8 编码字符串数据的引用。例如,字符串字面量存储在程序的二进制文件中,因此是字符串片。String 类型是由 Rust 标准库提供的,而不是编入核心语言的,它是一种可增长、可变、自有、UTF-8 编码的字符串类型。

2024-02-04 20:02:47 1222

原创 放假“疯狂”玩电脑的护眼操作

2. 打开注册表编辑器,依次点击【HKEY_CURRENT_USER】—【Control Panel】—【Colors】,在右侧找到并打开【Windows】。注:修改注册表有风险,切忌随意更改可能会造成系统瘫痪。建议在进行操作之前,先对注册表进行备份并在专业人士指导下慎重操作。由于大多数人的屏幕也是白色的,对眼睛刺激比较大,接下来,再教大家如何将系统变为舒服的豆沙绿。1. 点击【Win+R】开启运行键并输入【regedit】然后回车。,注意留好空格,最后点击确定。窗口底色就变成豆沙绿啦~

2024-02-04 13:57:00 718

原创 07-使用Package、Crates、Modules管理项目

在本节中,我们将讨论模块和模块系统的其他部分,即允许命名项目的路径、将路径引入作用域的 use 关键字,以及使项目公开的 pub 关键字。我们还将讨论 as 关键字、外部包和 glob 操作符。首先,我们将列出一个规则列表,以便将来组织代码时参考。然后,我们将详细解释每一条规则。

2024-02-03 23:28:19 1288 1

原创 06-枚举和模式匹配

结构体提供了一种将相关字段和数据组合在一起的方法,如 Rectangle 及其 width 和 height ,而枚举则提供了一种表示某个值是一组可能值之一的方法。例如,我们可能想说 Rectangle 是一组可能的形状之一,其中还包括 Circle 和 Triangle。为此,Rust 允许我们将这些可能性编码为一个枚举。让我们来看看我们可能想在代码中表达的一种情况,看看为什么在这种情况下枚举是有用的,而且比结构体更合适。假设我们需要处理 IP 地址。

2024-01-24 12:12:16 1016

原创 05-使用结构体构建相关数据

结构体与 "元组类型 "一节中讨论的元组类似,都可以保存多个相关值。与元组一样,结构体中的数据也可以是不同的类型。与元组不同的是,在结构体中,我们会为每块数据命名,这样就能清楚地知道这些值的含义。添加这些名称意味着结构体比元组更灵活:您不必依赖数据的顺序来指定或访问实例的值。要定义结构体,我们需要输入关键字 struct并为整个结构体命名。结构体的名称应描述被组合在一起的数据块的意义。然后,在大括号内定义数据的名称和类型,我们称之为字段。例如,下列显示了一个存储用户账户信息的结构体。

2024-01-23 23:41:18 1507

原创 04-了解所有权

所有权是一套管理 Rust 程序如何管理内存的规则。所有程序在运行时都必须管理它们使用计算机内存的方式。有些语言有垃圾回收功能,可以在程序运行时定期查找不再使用的内存(Java的垃圾回收机制);在其他语言中,程序员必须明确分配和释放内存(C/C++)。Rust 使用的是第三种方法:通过所有权系统管理内存,并由编译器检查一系列规则。如果违反任何规则,程序将无法编译。在程序运行过程中,所有权的所有特性都不会降低程序的运行速度。由于所有权对许多程序员来说是一个新概念,因此需要一些时间来适应。

2024-01-22 14:49:15 958

原创 03-常用编程概念

本章介绍几乎所有编程语言中都会出现的概念,以及它们在 Rust 中的工作原理。许多编程语言的核心都有许多共同点。本章介绍的概念都不是 Rust 独有的,但我们会在 Rust 的上下文中讨论这些概念,并解释使用这些概念的惯例。具体来说,将学习变量、基本类型、函数、注释和控制流。每个 Rust 程序中都会有这些基础知识,及早学习这些知识将为你的起步打下坚实的基础。Rust 语言与其他语言一样,有一组关键字仅供该语言使用。请记住,不能将这些关键字用作变量或函数的名称。

2024-01-21 10:59:19 1213

原创 02-编程猜谜游戏

本章通过演示如何在实际程序中使用 Rust,你将了解 let 、 match 、方法、关联函数、外部crate等基础知识。本章将实现一个经典的初学者编程问题:猜谜游戏。工作原理如下:程序将随机生成一个介于 1 和 100 之间的整数。然后,程序会提示玩家输入一个猜测。输入猜测值后,程序会显示猜测值是过低还是过高。如果猜测正确,游戏将打印一条祝贺信息并退出。

2024-01-19 12:15:05 1302

原创 01-开始Rust之旅

官方推荐使用rustup下载 Rust,这是一个管理 Rust 版本和相关工具的命令行工具。下载时需要连接互联网。这边提供了离线安装版本。本人学习的机器环境为: ubuntu x86_64,因此选用第②个工具链;1.2.

2024-01-18 16:56:24 1893 2

原创 00-Rust前言

Ask:为什么要近期想学习Rust?Answers: Rust出来也是有一段时间了,从Microsoft吵着要重构他们的C++"祖传代码"开始,Rust就披着“高效,安全”的头衔。而自己决定要学习Rust,是因为近期发现:涉及工作的部分开源代码也在悄然的发现变化。例如:Google在java端用Kotlin改写原有java代码,这个没有什么意外,毕竟Kotlin是Google的亲儿子。但是,最近发现Google也在修改native层的C/C++代码了.....​一图胜千言!

2024-01-18 14:21:40 1198

原创 Android中多个Sensor客户端注册“First flush Pending”问题

引言:近期在项目上遇到一个“FLP”问题。本文借此问题来分析:同一个sensor被多个App监听SensorEventListener事件时,app client被"First flush Pending"问题;

2024-01-12 15:44:41 954

原创 HIDL相关知识介绍

HIDL 是一种接口描述语言(IDL),用于指定 HAL 及其用户之间的接口。HIDL 允许指定类型和方法调用,并将其收集到interface和package中。更广义地说,HIDL 是一种在可独立编译的代码库之间进行通信的系统。从 Android 10 开始,HIDL 已被弃用,Android 正在迁移到到处使用 AIDL。这里说的弃用,指的是官方的弃用,即package不能以android.*为开头,否则编译时将会报错;

2024-01-06 16:43:46 1808

原创 3-写规则

规则出现在 Makefile 中,说明何时以及如何重制某些文件,这些文件被称为规则的目标文件。它列出了作为目标的先决条件,以及用于创建或更新目标的recipe。除了确定默认目标,规则的顺序并不重要。如果你没有另行指定目标,默认目标是第一个 Makefile 中第一条规则的第一个目标。有两个例外:①以"."开头的目标不是默认目标,除非它也包含一个或多个斜线"/";②定义模式规则的目标对默认目标没有影响。

2023-12-31 13:52:37 762

原创 2-编写Makefile

目标和先决条件部分会立即展开,而用于构建目标的recipe总是被延迟。这适用于显式规则、模式规则、后缀规则、静态模式规则和简单的前提条件定义。

2023-12-30 23:50:25 834

原创 1-Make概述与简介

你需要一个名为 Makefile 的文件来告诉 make 做什么。通常,Makefile 会告诉 make 如何编译和链接程序。在本章中,我们将讨论一个简单的 Makefile,它描述了如何编译和链接一个由八个 C 源文件和三个头文件组成的文本编辑器editor。Makefile 还可以告诉 make 在明确要求时如何运行其他命令(例如,删除某些文件作为清理操作)。当 make 重新编译editor编辑器时,必须重新编译每个已更改的 C 源文件。

2023-12-30 19:41:55 890

原创 init、zygote、system_server、watchdog分析

① --nice-name=system_server, 这个参数将在handleSystemServerProcess(parsedArgs)时设置新folk出来的进程名为:“而这个函数会调用RuntimeInit::applicationInit()方法,并通过反射调用com.android.server.SystemServer的main()方法;从1.3.3可知,action.cpp中的 RunBuiltinFunction()接口将会调用“class_start main”,并。

2023-11-27 17:56:59 860

原创 std::bind和std::thread使用

在这个例子中,我们使用std::bind创建了一个新的函数对象add5,它将add函数的第一个参数绑定到了值5上。std::bind是一个c++标准库函数模板,通过将参数绑定到可调用实体(函数或成员函数),用于创建可调用对象(函数对象)。在这个例子中,我们使用std::bind创建了一个新的函数对象subtractReordered,它在调用subtract函数时交换了参数的顺序。无论绑定的是类成员函数还是非成员函数,std::bind都允许自定义参数,重新排序,并使用特定的参数绑定创建可调用对象。

2023-09-29 14:36:02 1205

原创 第二章 常用的系统播放器MediaPlayer

SurfaceView是View的子类,实现了Parcelable接口,其中内嵌了一个专门用于绘制的Surface,SurfaceView可以控制这个Surface的格式和尺寸,以及Surface的绘制位置。可以理解Surface就是管理数据的地方,SurfaceView就是展示数据的地方。最后总结一下,SurfaceView中调用getHolder函数,可以获得当前SurfaceView中的Surface对应的SurfaceHolder,SurfaceHolder开始对Surface进行管理操作。

2023-08-20 23:08:25 67

原创 第一章 音视频基础知识

音视频术语是了解音视频开发的基础内容,如一些专有名词、常见的口语化名词等,它们都表述了音视频中客观存在的属性或特征。

2023-06-29 00:29:16 274

原创 Binder进程间通讯

以frameworks/av/media/mediaserver/main_mediaserver.cpp为例来说明Binder通讯机制;

2023-02-24 00:26:15 601

原创 Android中的智能指针

Java和C/C++的一个重大区别,就是它没有“指针”的概念。这并不代表Java不需要使用指针,而是这个“超级武器”被隐藏了起来。“水能载舟,亦能覆舟”,如果读者曾使用C/C++开发过一些大型项目,就会知道开发人员最头疼的事情莫过于概率性极低(Once)的死机问题——而造成系统宕机的根源,往往就是指针异常。所以Java以其他更“安全”的形式向开发人员提供了隐性的“指针”,使得用户既能享受到指针的强大功能,又能尽量避免指针带来的灾难。C/C++项目中常见的指针问题可以归纳为:指针没有初始化;

2023-02-17 20:15:10 282

init、zygote、system-server、watchdog分析

init、zygote、system-server、watchdog分析

2024-05-28

SystemServer启动阶段思维示意图

SystemServer启动阶段思维示意图

2024-05-28

rust-1.75.0-x86-64-unknown-linux-gnu.tar

Linux x86_64平台的Rust 1.75.0安装包

2024-01-18

rust-1.75.0-x86-64-pc-windows-gnu

Windows平台的rust 1.75安装包

2024-01-18

C++23版本的最终草案

C++23是 C++ 编程语言 ISO/IEC 14882标准继C++20 之后的下一个版本的非正式名称

2024-01-18

VectorCANdb-plusplus-3.1.021 SP2

学习使用,可用于看dbc文件,学习byte order等内容; 不用于任何商业行为,商业使用请联系Vector厂家。

2023-04-19

VectorCANdb-plusplus-3.1.018

学习使用,可用于看dbc文件,学习byte order等内容; 不用于任何商业行为,商业使用请联系Vector厂家。

2022-04-21

Java Native Interface(JNI)官方学习手册

JNI官方学习手册(英文版)

2022-04-17

空空如也

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

TA关注的人

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