自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 cefclient源码解析

现在,我们知道了cefclient创建一个窗口的大致流程及其设计框架,这只是主进程中的内容,将继续探索。

2025-03-03 09:00:00 1369

原创 前端开发框架Chromium Embedded Framework (CEF)再探

在此之前,介绍了如何在Windows平台上搭建CEF的开发环境,并就官方的sample源码进行了简单的剖析,但是还不够,所以笔者继续对CEF进行了一番探索。

2025-02-17 09:00:00 674

原创 一个为Rust程序提供进程间通信的工具包

Interprocess crate在绕过网络协议栈的同时,为我们提供了高效、统一、简洁的本地进程间通信工具包,这在我们需要本地进程间通信,同时又需要良好的跨平台特性时,除了TCP/IP,又多了一种选择致敬kotauskas(Interprocess 的Owns)

2025-02-17 09:00:00 319

原创 前端开发框架Chromium Embedded Framework (CEF)入门

上面已经了解了CEF运行时会在合适的时机调用SimpleApp重写的CefBrowserProcessHandler中的虚方法,具体有如下:在CEF上下文初始化后,在主进程的UI线程中回调该虚方法:启动子进程时回调该方法,该方法提供修改子进程命令行参数的机会。当启动的是渲染进程时,将在主进程的UI线程上调用;当启动的是GPU进程时,将在主进程的IO线程上调用获取默认的CefClient。

2025-02-10 09:00:00 975

原创 Microsoft Windows 服务应用开发入门(Rust for Windows)

MicrosoftWindows服务开发相比普通的应用开发会有一些区别,如果你的业务确实需要使用MicrosoftWindows服务,多了解相关特性是必要的微软为方便Rust开发者打造的windowscrate,几乎所有API都是unsafe,同时docs上的文档也不健全,所以决定使用这个包的开发者一定要限制unsafe代码的范围,做好安全的封装,API的feature多去微软官网翻看

2025-01-20 09:00:00 777

原创 如何减小Rust包体积(min-sized-rust)

中还有一些减小包体积的办法,但是剩下的方案更多是一种极端,正常工作中一般不会采用如果你也遇到了包体积过大的问题,不妨试试上面介绍的缩减包体积的方法(笔者的项目中,lto优化对于减小包体积起到了决定性的作用)公众号名称:zl.rs。

2025-01-13 09:00:00 868

原创 使用alexandrie搭建私有crate仓库

解决了所有问题之后,你成功的搭建了一个crate仓库,并向该仓库push了第一个crate,也使用一个demo拉取了该私有仓库上的一个crate,这一切运行的都很好,祝你好运公众号名称:zl.rs。

2025-01-06 09:00:00 604

原创 C/C++和Rust FFI时的字符串转换(CString & CStr)介绍

在写C/C++到Rust FFI代码时会涉及非常多的字符串转换,所以对CString和CStr的了解一定要非常充分,这样才能让你的Rust产物继续safe的工作!公众号名称:zl.rs。

2024-12-30 09:00:00 654

原创 使用Rust中的actix_web框架搭建双向认证的Web服务器

Actix-Web是Rust中比较著名的一个Web开发框架。它专为高性能、高并发的Web应用而设计。下面简单介绍下如何使用Actix-Web搭建一个使用X.509 v3版本自签证书实现https双向认证的Web服务器同时文章会介绍在Rust中如何使用reqwest开发客户端进行双向认证的请求。

2024-12-23 09:00:00 1248

原创 使用reqwest开发HTTP客户端进行双向认证请求

reqwest是一个用于Rust的HTTP客户端库,它提供了简单易用的API来发送HTTP请求和处理响应接下来介绍下如何使用reqwest进行https的双向认证请求同时文章介绍了使用actix_web如何搭建一个双向认证的Web服务器。

2024-12-23 09:00:00 591

原创 tokio实时监控工具tokio-console简介

以上是对tokio-console使用的介绍,对于runtime中出现异常时,tokio-console以何种形式展示还在探索中 . . .

2024-12-16 09:00:00 955

原创 使用cbindgen为Rust导出C API供C/C++使用

C/C++作为历史沉淀更为厚重的工具,Rust必须做好和C/C++的FFI才能一步一个脚印的发展和前进。公众号名称:zl.rs。

2024-12-09 09:00:00 909

原创 Rust异步框架tokio开发实践

tokio的实现学习了go,以go这门为异步而生的工具为目标,相信tokio一样能扛起Rust异步编程的大旗。

2024-12-02 09:00:00 1009

原创 对比C++,Rust在内存安全上做的努力

Rust作为一颗冉冉升起的新星,已经得到了越来越多人的认可,将其压入你的技术栈,一定会是一个不错的选择。

2024-11-25 09:00:00 2654 2

原创 对Rust异步编程中Pin(固定)的理解

作为有栈协程,最终Rust还是通过Pin曲线救国,在异步编程中也实现了其内存安全的承诺。

2024-11-18 09:00:00 1139

原创 使用libwebsockets建立简单的websocket连接

作为一个纯C实现的 websocket 协议库(还支持其他协议),libwebsockets 具有占用资源少,性能高的优点,但是想要在多线程环境下很好的使用libwebsockets,还需要下一些功夫进行深入的了解。欢迎大家关注微信订阅号:zl.rs。

2024-11-11 09:00:00 2601

原创 Sqlite原子提交原理

哪有什么岁月静好,只不过是Sqlite再替你负重前行

2024-11-02 11:11:32 1028

原创 Rust代码静态分析工具Clippy浅析

clippy原生提供了非常丰富的Lint 集,这些规则满足了我们对编程规范大部分的需求,还有最后一点需求无法满足也可以通过自定义Lint 集(有机会再分享下这个)的方式实现。同时,基于这套框架,clippy让编程规范不再是空中楼阁,能够很好的在开发环节中落地(我们团队C++编程规范坟头草都有三米了)。微信公众号:zl.rs。

2024-10-26 20:24:32 1017

原创 子进程创建新会话和父进程完全分离

创建新会话和进程组和父进程彻底分离

2024-10-20 15:30:13 849

原创 UsbHostManager解析

UsbHostManager和UsbDeviceManager的区别在于,UsbDeviceManager是将手机作为一个设备,比如手机连上电脑,使用adb、mtp等;而UsbHostManager,是将手机作为一个host,比如手机连接usb鼠标、usb摄像头等,就会new出一个UsbDevice出来。UsbHostManager初始化UsbHostManager和UsbDeviceManager都是在UsbService中创建的(Z:\zw\frameworks\...

2021-11-20 20:39:18 4350

原创 binder Native层源码学习与解析——IPCThreadState

参考文章:《深入理解Android++卷1》 在注册自己的binder服务时,会调用defaultServiceManager获得ServiceManager的客户端IServiceManager,然后通过IServiceManager来执行ServiceManager提供的注册服务addService,其代码如下所示: virtual status_t addService(const String16& name, const sp<I...

2021-11-07 16:56:54 3513 2

原创 binder Native层源码学习与解析

参看文章:《深入理解Android++卷1》ProcessState类 在注册每个binder服务之前,都需要通过ProcessState类的self方法获取到一个ProcessState的sp指针,如下:sp<ProcessState> proc(ProcessState::self());ProcessState类是一个单例模式,每个进程只会创建一个ProcessState类,ProcessState类的定义在 ./frameworks...

2021-11-07 10:11:54 497

原创 Android&Linux策略路由

在Android4.4之前只使用了一张路由表,但从Android5.0之后开始,在同一时间下,Android允许多网络类型连接,每个网络有自己的一套dns、网关、路由表等。比如:eth0和wlan0分别有自己的一套。应用层在建立socket连接的时候,可以自由选择使用哪一套网络,同时,这里还涉及到不同网络表示netid,应用层可以通过绑定指定的netid来设置数据包走哪个指定的网络。 Android5之前,统一时间下,只允许有一种网络类型连接,但是Android5之后,支持...

2021-11-05 19:39:30 4479 1

原创 JNI对Java对象的引用

参考文献:JNI学习笔记——局部和全局引用JNI将Java层的类实例、数组类型暴露为不透明的引用,native层的代码会通过JNI提供的函数来访问这个不透明的引用。JNI中有着不同种类的引用,分别为局部引用、全局引用和弱全局应用。 JNI对Java层实例的局部引用能够被自动释放,全局引用和弱全局引用在程序员主动释放之前都是有效的。JNI的局部引用和全局引用能够使Java中对应的实例不会被JVM的垃圾回收机制所回收,但是弱全局引用允许其对应的实例被回收。局部引用...

2021-11-03 19:36:20 809

原创 通过ueventd.rc文件修改设备节点的问题

项目里面需要将系统的串口库封给JNI,然后java来调用系统提供的串口接口。这些串口接口中涉及到读写权限的问题,被Android的SELinux和Linux的用户组权限所影响,因为java的进程权限比较低,所以导致系统封给java的接口调用失败,且selinux和Linux的用户组权限都在报错。解决Linux的用户组权限报错: 需要去修改ueventd.rc文件。但是ueventd.rc文件还是有一定的修改规则,通过几次修改之后大概总结了一下这个规则,不保证对错。...

2021-09-28 11:48:23 1455

原创 在插入HID类型的usb设备之后,Android设备的输入法被隐藏

参考文献:https://blog.youkuaiyun.com/xiaolei10086/article/details/41212845链接公司的一款产品在焊上二维码相关的模块之后输入法直接退出了,不管怎么点都没有办法弹出来。而且在adb shell下使用lsusb发现,此时多出了一个usb设备,且该设备并不需要用到。把二维码模块相关的GPIO引脚拉低断电之后该usb设备消失,输入法也正常弹出。 根据以上现象以及去问硬件得出原因是因为二维码模块中也有一个u...

2021-08-12 10:02:55 526

原创 Android.mk文件相关知识

参考文献:https://blog.youkuaiyun.com/niuba123456/article/details/80948186Android.mk官方文档1、LOCAL_PATH := $(call my-dir):每个Android.mk文件的开头都是这句,Build System提供的宏函数 my-dir,此变量返回表示当前Android.mk文件所在路径。2、include $(CLEAR_VARS):会请清除此前设置的LOCAL_xxx变量,但是不会清除LOCAL_PATH。3、

2021-08-10 19:13:38 224

原创 库使用创建相关

动态库依赖动态库编译时需要用到第三方动态库的时候,编译时需要使用 –l 指定用哪些动态库;使用 –L 指定编译时查找动态库的编译路径路径,不代表运行时找库文件的路径,但是在编译时可以添加编译选项 -WI,-rpath= 来指定运行时动态库的搜索路径。运行时动态库的运行搜索路径由全局变量 LD_LIBRARY_PATH 定义。可以使用dlopen()函数和dlsym()函数(#include <dlfcn.h> )来装载动态库,这样便...

2021-08-08 10:54:51 1204

原创 input子系统相关

本文是我学习时所写,非百分之百原创,望指出错误之处。参考资料:input子系统按键处理闲聊linux中的input设备在系统中会出现很多的input设备,比如:键盘、屏幕等等,这些物理设备都会统一的抽象为input设备。用来抽象这些设备的数据结构是struct input_dev结构,该结构如下:struct input_dev { const char *name; const char *phys; const char *uniq; struct input_id id; un

2021-01-03 09:02:35 281 2

原创 Linux驱动定时器相关

本文为我学习时所写,非百分之百原创,望指出错误之处。参考资料:Linux驱动之定时器(mod_timer)内核定时器的使用(好几个例子add_timer)linux内核中定义了定时器结构,struct timer_list,该结构如下:#include<linux/timer.h>struct timer_list { struct list_head list;   unsigned long expires; //定时器到期时间  unsigned lo

2020-12-29 20:54:03 166

原创 wake_lock锁机制和device wakeup

本文是我学习时所写,非百分之百原创,望指出错误之处。参考资料:(linux)wake_lock机制linux设备驱动中device_init_wakeupAndroid的休眠唤醒主要基于wake_lock机制,只要系统中存在任一有效的wake_lock,系统就不能进入深度休眠,但可以进行设备的浅度休眠操作。wake_lock一般在关闭lcd、tp但系统仍然需要正常运行的情况下使用,比如听歌、传输很大的文件等。以下为struct wake_lock结构:enum { WAKE_LOCK

2020-12-29 20:51:38 1689

原创 LINUX设备驱动PLATFORM(平台)总线相关

在总线模型中,device和driver是由虚拟总线来进行管理的。struct bus_type对象就是抽象的总线,就是由这个对象来对设备和驱动进行管理,以下便是该对象的部分成员。struct bus_type { const char *name; // 总线名字 struct bus_attribute *bus_attrs; // 该总线的属性 struct device_attribute

2020-12-27 14:39:29 653 1

原创 JNI层映射C/C++接口给JAVA层调用

JAVA本地库加载在java层如果想要使用C/C++提供的接口,那么就需要通过本地加载的方式

2020-12-27 11:50:08 854

原创 设备树相关

常用属性1、 #address-cells属性和、#size-cells属性cell 指一个 32 位的数值,address-cells:address 要用多少个 32 位数来表示;size-cells:size 要用多少个 32 位数来表示。例如描述一段内存的起始地址和大小:/ { #address-cells = <1>; #size-cells = <1>; memory { reg = <0x80000000 0x20000000>; };}

2020-12-26 20:16:36 536

原创 安卓添加按键流程

1、首先需要在 ./kernel/include/uapi/linux/input-event-codes.h 文件中定义驱动捕捉并上传给linux层的键值。如下:#define KEY_RESERVED 0#define KEY_ESC 1#define KEY_1 2#define KEY_2 3#define KEY_3 4#define KEY_4 5#define KEY_5 6#define KEY_6 7#define KEY_7 8#de

2020-12-18 16:23:49 633

sqlite3.lib x86-64 debug 静态库

程序需要依赖sqlite的可以使用该资源,当然这只是一个demo级别的解决方案,最好还是去sqlite官网使用源码编译出产物来

2025-01-04

空空如也

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

TA关注的人

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