自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++进阶指南1——vector基础

本文介绍了C++中vector容器的基本概念和常用操作。vector是一个能自动扩容的动态数组,相比普通数组更加灵活。使用前需包含<vector>头文件并指定命名空间。主要功能包括:创建空vector或指定大小/初始值的vector;通过push_back()添加元素;使用下标或at()访问元素;通过下标或at()修改元素;利用pop_back()、erase()或clear()删除元素。还介绍了size()和capacity()的区别,以及reserve()预分配空间的优化技巧。vector作

2026-01-30 16:49:52 285

原创 JNI 编程指南12—— JNI多线程

本文介绍了JNI环境下多线程编程的核心要点:JNIEnv是线程作用域的变量,不能跨线程传递;局部引用不能跨线程使用。通过示例代码演示了如何在子线程获取JNIEnv,以及使用全局引用跨线程回调Java方法的技术要点。关键点包括:通过JavaVM获取线程专属JNIEnv、使用NewGlobalRef创建全局引用、通过标志位同步线程释放资源。文章提供了完整的Java和C++代码示例,说明了多线程JNI编程的正确实践方法。

2026-01-30 15:30:38 313

原创 JNI 编程指南11—— JNI 调用性能优化

本文介绍了两种优化JNI调用性能的方法:使用时缓存和静态初始化缓存。由于JNI调用比Java方法调用耗时更多,建议减少调用次数并批量处理任务。重点是通过缓存GetMethodID等返回的ID值来避免重复查找,提升性能。使用时缓存通过全局变量保存methodID,仅在首次调用时获取;静态初始化缓存在类加载阶段通过native方法预先获取并缓存ID。两种方法都有效减少了不必要的JNI调用开销,以空间换时间提高执行效率。

2026-01-30 14:29:13 234

原创 JNI 编程指南10——从内存角度看引用类型

本文从内存角度分析了JNI中的三种引用类型:局部引用、全局引用和弱全局引用。Java程序内存分为Java Memory和Native Memory,JNI引用类型是指向JVM中Java对象内存的指针。局部引用存储在Local Reference Table中,生命周期限于当前Native方法调用;全局引用可跨线程使用,需手动释放;弱全局引用可能被GC随时回收,使用时需通过NewLocalRef创建临时强引用避免被回收。文章详细解析了三者的内存管理机制和使用注意事项,并提供了代码示例说明正确使用弱全局引用的方

2026-01-30 13:52:59 536

原创 JNI 编程指南9——异常处理

本文介绍了JNI程序中的异常处理机制。主要分为两类:一是JNIEnv内部函数抛出的异常,通过检查返回值判断异常后直接return,JVM会将异常传递给Java层;二是Native回调Java方法时抛出的异常,可通过Java层try-catch捕获或Native层处理。Native层处理异常时,可使用ExceptionCheck检测异常、ExceptionOccurred获取异常对象,并选择清除异常或抛出新异常给Java层。文章通过具体代码示例演示了这两种异常处理方式的实际应用场景和处理流程。

2026-01-29 17:36:05 291

原创 JNI 编程指南8——Native 访问 Java

本文介绍了在JNI开发中如何访问Java成员变量和方法。主要内容包括:1)通过GetFieldID获取成员变量ID,使用Get/SetObjectField访问和修改成员变量值;2)通过GetMethodID获取方法ID,使用CallVoidMethod调用Java方法;3)静态成员的访问方式与实例成员类似,但需要使用GetStaticFieldID和CallStaticVoidMethod;4)强调了对jclass对象和局部引用的内存管理,需要及时调用DeleteLocalRef释放资源。文章通过具体代码

2026-01-29 16:37:00 258

原创 JNI 编程指南7——数组访问

本文介绍了JNI中数组访问的相关技术,包括基本类型数组、引用类型数组和二维数组的处理方法。在基本类型数组中,通过GetIntArrayElements等函数获取数组指针进行操作;引用类型数组使用GetObjectArrayElement访问元素;二维数组则需要嵌套获取行列数据。文章还列举了关键JNI函数如GetArrayLength、NewObjectArray等的用法说明,并提供了完整的代码示例,展示了如何在JNI层与Java层之间传递和操作各类数组数据。

2026-01-29 15:40:23 700

原创 JNI 编程指南6——字符串处理

本文介绍了JNI中字符串处理的相关函数和方法。主要内容包括:1)JNI字符串处理示例,展示如何将Java字符串转换为C字符串并返回;2)详细解析了GetStringUTFChars、ReleaseStringUTFChars、NewStringUTF等核心函数的功能和参数说明;3)介绍了字符串长度获取、字符数组转换等相关辅助函数;4)特别说明了GetStringCritical/ReleaseStringCritical这对高效但有限制的函数。文章强调在使用这些函数时要注意内存管理、异常处理和编码转换等问题

2026-01-28 17:33:03 447

原创 JNI 编程指南5——JavaVM 详解

本文摘要: JavaVM是描述Java虚拟机的结构体,在Android平台上一个进程只对应一个ART虚拟机和JavaVM对象。文章详细介绍了JavaVM在C/C++中的不同定义方式,以及其核心成员函数如DestroyJavaVM、AttachCurrentThread等。同时提供了两种获取JavaVM的方法:在JNI_OnLoad函数中通过参数直接获取,或通过JNIEnv的GetJavaVM函数间接获取。这些内容为理解JNI编程中JavaVM的使用提供了基础指导。

2026-01-28 16:31:07 283

原创 JNI 编程指南4——JNIEnv 详解

本文详细介绍了JNIEnv的概念和使用方法。JNIEnv是Java本地接口环境,提供了一系列函数简化JNI编程。文章首先分析了JNIEnv在C和C++中的不同结构体定义,然后说明了单线程和多线程环境下获取JNIEnv的方法,最后分类整理了JNIEnv中的常用函数,包括类操作、对象创建、字段访问和方法调用等。这些函数的具体使用可以参考Oracle官方JNI文档。

2026-01-28 16:20:28 694

原创 JNI 编程指南3——描述符

本文介绍了JNI开发中的三种关键描述符:类描述符、域描述符和方法描述符。类描述符用于在Native代码中定位Java类,格式为"包名/类名";域描述符表示Java数据类型,如"I"表示int,"Ljava/lang/String;"表示String类;方法描述符则用于标记方法签名,包含参数和返回值类型。文章通过表格和示例详细说明了各种描述符的转换规则和使用场景,为JNI开发提供了基础参考。

2026-01-28 16:02:39 43

原创 JNI 编程指南2——JNI 数据类型

JNI数据类型与转换 本文介绍了JNI(Java Native Interface)程序中的数据类型及其转换方法。主要内容包括: 数据类型分类: Java类型 JNI类型 C/C++类型 JNI程序需要在三种类型间进行转换 基本数据类型: 表格列出了boolean、byte、char等基本类型在三种语言中的对应关系 这些类型可直接在JNI中使用,无需转换 引用类型: 详细说明了Object、String、Class等引用类型的JNI对应类型 提供了完整的引用类型对照表 类型转换示例: 基本类型转换:直接使用

2026-01-28 15:50:31 683

原创 JNI 编程指南1——JNI简介和注册方式

本文详细介绍了JNI(Java Native Interface)技术的基本概念和应用场景。首先通过一个"HelloWorld"示例演示了JNI静态注册的开发流程,包括Java代码编写、头文件生成和C语言实现。接着讲解了JNI动态注册的实现方式,包含三个关键步骤:实现本地方法、构建JNINativeMethod数组和注册函数。文章还对比了C和C++环境下JNIEnv的使用差异,并解释了extern "C"、JNIEXPORT等关键概念的作用。这些内容为Java与C/C

2026-01-28 14:56:53 604

原创 Linux Shell 脚本编程——脚本自动化基础

本文介绍了Shell脚本自动化的基础知识,包括字符串、整数和文件的判断比较方法,if和case条件语句的使用,for循环的多种形式,数组的定义与遍历,以及函数的定义与调用。内容涵盖了Shell脚本编程的核心语法结构,通过示例代码展示了各类操作的具体实现方式,为Shell脚本自动化开发提供了实用参考。

2026-01-27 17:16:23 80

原创 Linux Shell 脚本编程——核心基础语法

本文介绍了Shell脚本的核心基础语法,包括Hello World示例、脚本执行方式、输入输出操作、引号使用、命令替换、变量定义以及grep与正则表达式等内容。文章详细讲解了echo、printf、read等命令的用法,管道和重定向的使用技巧,双引号与单引号的区别,以及变量定义和系统预设变量的应用。最后还介绍了grep命令的基本使用和正则表达式语法,帮助读者掌握文本过滤的基本方法。这些内容为Shell脚本编程提供了必要的基础知识。

2026-01-27 16:54:45 538

原创 Make 构建工具入门

本文介绍了Make构建工具的基本概念和使用方法。Make是一种自动化构建工具,通过Makefile文件定义构建规则,主要包括目标文件、依赖关系和构建命令三部分。文章详细讲解了Makefile的格式、基础语法(如注释、回声、通配符、模式匹配等),以及变量的定义和使用方式。通过简单示例演示了如何创建Makefile并执行make命令,展示了Make工具如何根据文件依赖关系自动执行构建过程。Make工具适用于任何需要根据文件变化重新构建的项目,是软件开发中常用的自动化构建解决方案。

2026-01-27 15:49:34 592

原创 AIDL Hal 开发笔记7----AIDL HAL 的升级

本文介绍了AIDL HAL接口升级的具体步骤。首先修改aidl接口文件,新增了hello_init()方法,并通过m命令生成版本2的API目录结构。接着编译模块后,在输出目录生成了V2版本的相关库文件。最后更新了服务端实现代码,在头文件和实现文件中添加了新接口的定义。整个过程遵循了保持老版本兼容性的原则,仅新增接口而不修改原有接口。

2026-01-26 14:29:11 180

原创 AIDL Hal 开发笔记6----添加硬件访问服务

本文介绍了在Android框架中添加硬件访问服务的实现过程。首先在frameworks/base/core/java/android/hardware/hello/目录下定义AIDL接口文件IHelloManager.aidl,该接口包含读写方法hellohal_write()和hellohal_read()。通过分析编译生成的class文件,展示了接口定义、默认实现和服务端Stub类的具体实现。其中Stub类继承自Binder,实现了接口方法转换和远程调用处理,包含TRANSACTION标识和asInte

2026-01-23 16:58:19 557

原创 AIDL Hal 开发笔记5----实现AIDL HAL

本文介绍了如何实现一个简单的AIDL HAL模块。主要内容包括:在hardware/interfaces目录下创建aidl hal项目结构,编写IHello.aidl接口文件,配置Android.bp构建文件,处理编译过程中的API冻结问题。通过执行update-api和freeze-api命令生成current和版本目录,最终完成模块编译并生成多种语言的接口库。该过程详细展示了AIDL HAL模块从创建到编译的完整流程,特别说明了在REL版本下处理接口冻结的特殊要求。

2026-01-22 15:45:49 672

原创 AIDL Hal 开发笔记4----驱动开发

本文介绍了Linux内核驱动开发的基本流程。首先展示了如何编写一个简单的字符设备驱动hello_driver.c,包括定义file_operations结构体、实现读写函数、注册驱动等步骤。然后说明了如何通过修改Kconfig和Makefile将驱动编译进内核或编译为模块。最后提供了一个Native测试程序hello_drv_test.c,用于验证驱动功能。整个开发过程涵盖了从驱动编写、内核配置到功能测试的完整流程。

2026-01-16 14:15:57 651

原创 AIDL Hal 开发笔记3---- stable-c HAL 实例分析

本文分析了Android中的stable-c HAL实现,以graphics/mapper模块为例。stable-c HAL是一种高性能的直接链接库,不同于跨进程调用的HIDL HAL。重点介绍了IMapperV5Impl接口类及其在模拟器中的实现CrosGrallocMapperV5,该类提供了缓冲区管理、元数据操作等核心功能。文章还说明了通过AIMapper_loadIMapper函数获取接口指针的机制,以及使用extern "C"确保C/C++程序兼容性的设计方法。该实现框架为芯片

2026-01-16 10:25:52 63

原创 AIDL Hal 开发笔记2----AIDL HAL 实例分析light hal

本文分析了Android系统中Light硬件服务的架构实现。主要内容包括: 系统服务启动流程:SystemServer通过startBootstrapServices启动LightsService,该服务包含一个LightsManagerBinderService内部类,作为Binder服务端向应用提供接口。 服务架构层次:LightsManagerBinderService通过Supplier<ILights>成员访问HAL层,其中ILights是HAL层的Binder服务接口。 HAL连接机

2026-01-15 17:34:06 291 1

原创 AIDL Hal 开发笔记1----AIDL HAL 整体架构

AIDL HAL架构与振动器调用流程分析 摘要:Android 11后引入AIDL HAL架构取代HIDL HAL,主要特点包括: HAL作为Binder服务注册到ServiceManager 常规调用路径:App→Framework系统进程→HAL服务(两次跨进程) 特殊场景下App可直接访问HAL服务 高性能需求模块采用stable-c HAL(so库动态加载) 以振动器为例,调用流程为: App通过getSystemService获取VibratorManager服务 调用链:Activity→Con

2026-01-15 15:53:11 632

原创 HIDL Hal 开发笔记10----添加硬件访问服务(Java 层调用 HIDL)

本文介绍了在Android Framework中通过Java层直接调用HIDL服务的实现方法。首先在HIDL接口配置中启用Java封装类生成,编译后自动生成IHello.java。然后删除原有的JNI调用方式,在框架核心模块添加对HIDL Java接口的依赖。最后改造服务端HelloService,直接通过IHello.getService()获取HIDL服务实例,实现了Java层对硬件服务的直接访问,简化了调用链路。该方法避免了JNI层的中间转换,更符合Android HAL的设计规范。

2026-01-13 16:10:23 580

原创 HIDL Hal 开发笔记9----App访问硬件服务

本文介绍了在Android原生应用中调用系统服务HELLO_SERVICE的方法。通过修改frameworks/base下的Activity代码,演示了两种调用方式:一种是使用getSystemService获取服务实例,另一种是直接实例化HelloManager。代码示例展示了如何调用服务的write()和read()方法,并附带了日志输出截图验证调用结果。该实现可用于Android应用与硬件服务的交互场景。

2026-01-12 16:58:48 30

原创 HIDL Hal 开发笔记8----添加硬件访问服务(JNI 调用 HIDL)

本文介绍了在Android框架中添加硬件访问服务的实现步骤:1)定义AIDL接口文件IHelloService.aidl;2)实现服务端HelloService类继承自IHelloService.Stub;3)通过JNI层实现com_android_server_HelloService.cpp,调用HIDL接口进行硬件访问;4)在Android.bp中引入HIDL接口库并注册JNI方法。整个流程展示了如何通过AIDL和HIDL实现跨进程硬件服务调用。

2026-01-12 15:30:39 715

原创 HIDL Hal 开发笔记7----简单 HIDL HAL 实现

本文介绍了如何实现一个简单的HIDL HAL模块,主要包含以下内容: 创建HAL接口文件IHello.hal,定义了服务对外提供的读写接口 使用hidl-gen工具将HAL文件转换为C++实现代码 在生成的Hello.cpp中添加对/dev/hello设备的读写操作实现 编写服务端程序service.cpp,向HwServiceManager注册服务 创建服务启动配置文件和服务清单XML文件 该实现基于HIDL框架,通过Binder IPC机制提供跨进程服务访问能力,同时与底层驱动设备进行交互。整个架构包含

2026-01-08 17:03:29 1016

原创 HIDL Hal 开发笔记6----驱动开发

本文介绍了Linux内核驱动开发的完整流程,从编写简单字符设备驱动到集成到内核的全过程。首先详细讲解了如何实现一个基本的字符设备驱动模块,包括定义file_operations结构体、实现读写接口等核心功能。然后说明了如何通过Kconfig和Makefile将驱动模块编译进内核,并演示了menuconfig配置选项的使用。最后介绍了权限配置方法,特别是通过修改ueventd.rc文件来设置设备节点的访问权限。整个过程涵盖了驱动开发的关键步骤,为后续实现HIDL HAL接口奠定了基础。

2026-01-08 09:33:05 626

原创 HIDL Hal 开发笔记5----Same-Process HALs 实例分析

本文分析了Android Same-Process HALs的实现机制,以graphics.mapper@2.0 HAL模块为例。该模块以共享库形式存在,通过passthrough模式直接链接到调用进程,满足性能需求。文章从HAL层实现入手,分析了Android.bp配置和passthrough.cpp源码,重点追踪了SurfaceFlinger获取mapper服务的调用链路,包括getService()到getRawServiceInternal()的过程。这种架构避免了跨进程通信开销,适用于对性能敏感的

2026-01-07 11:16:36 709

原创 HIDL Hal 开发笔记4----Passthrough HALs 实例分析

本文分析了Android振动器HAL的Passthrough实现框架。Passthrough HALs通过HwBinder机制复用传统HAL实现,主要包括服务端实现和客户端调用两部分。服务端通过defaultPassthroughServiceImplementation()函数注册HwBinder服务,并加载传统HAL操作硬件。源码结构清晰,包含impl共享库和服务可执行程序,通过模板函数实现服务注册和线程池配置。该设计实现了HAL层的高效复用,为硬件抽象层提供了标准化的实现方案。

2026-01-06 17:22:23 768

原创 HIDL Hal 开发笔记3----Binderized HALs 实例分析

本文分析了Android Binderized HALs架构下的振动器实现。HAL层以独立进程形式存在,内部通过HwBinder服务端对象提供远程调用服务。以Google Pixel4的振动器HAL为例,详细介绍了服务端实现:包括HwApi/HwCal驱动封装类、继承自IVibrator.hal的Vibrator服务端类,以及注册HwBinder服务的可执行程序。同时阐述了Framework层通过JNI调用HAL服务的客户端实现方式,展现了Binderized HALs的整体架构和跨进程通信机制。

2026-01-06 14:25:24 510

原创 HIDL Hal 开发笔记2----HIDL HAL 实例程序

HIDL HAL 实例程序实现摘要 本文详细介绍了如何在Android系统中实现一个Binderized HAL模块。主要内容包括: HAL文件创建: 在vendor目录下创建规范化的HIDL接口目录结构 编写IHello.hal文件定义接口方法(addition_hidl、write、read) 代码生成: 使用hidl-gen工具将HAL文件转换为C++实现模板 解释hidl-gen命令各参数含义及作用 核心实现: 修改生成的Hello.cpp文件实现具体功能 包含日志打印和基本加法运算实现 该实例展示

2025-12-30 10:12:30 895

原创 HIDL Hal 开发笔记1----Android 8 HAL 变迁

摘要 本文分析了Android 8中HAL层的重要变革。传统HAL架构存在升级困难的问题,Google通过引入Treble架构进行改进:将HAL移至独立Vendor分区,改用进程间通信(HwBinder),并严格规范系统分区与Vendor分区的交互方式。文章详细介绍了VNDK、LL-NDK和SP-HAL等新机制如何解决交叉依赖问题,确保系统可单独升级。同时对比了HwBinder与传统Binder的异同,指出HwBinder是专为Framework与Vendor分区通信设计的RPC框架。这些改进显著提升了An

2025-12-24 14:23:48 1086 1

原创 传统 Hal 开发笔记6----App 访问硬件服务

App 访问硬件服务。

2025-12-16 16:02:42 210

原创 传统 Hal 开发笔记5 —— 添加硬件访问服务

本文介绍了Android系统中添加硬件访问服务的实现过程,主要包括三个部分:1)定义AIDL接口文件IHelloService.aidl,声明open、write、read等硬件操作方法;2)实现服务端HelloService.java,继承AIDL接口并声明本地JNI方法;3)通过JNI层com_android_server_HelloService.cpp实现硬件模块加载和具体操作,包括设备打开、数据读写等功能。整个实现遵循Android HAL架构,通过JNI桥接Java层与底层硬件驱动,为上层应用提

2025-12-15 16:35:22 313

原创 传统 Hal 开发笔记4----实现 Hal 模块

本文摘要介绍了如何为驱动程序实现一个简单的HAL模块。主要内容包括:1)定义hello_hal.h头文件,创建hello_hal_device_t结构体及相关函数原型;2)实现hello_hal.c源文件,包含设备操作函数如open/read/write的具体实现;3)构建HAL模块入口HAL_MODULE_INFO_SYM,并初始化模块方法和设备结构体。该HAL模块通过文件描述符操作/dev/hello设备,提供了标准化的硬件抽象层接口。

2025-12-12 17:04:43 328

原创 传统 Hal 开发笔记3----驱动开发

本文介绍了Linux内核驱动的开发流程。首先编写了一个简单的字符设备驱动hello_driver.c,实现了open/read/write等基本操作,并通过module_init/exit机制注册驱动。然后将该模块配置到内核编译选项中,修改Kconfig和Makefile使其可编译进内核。最后开发了一个Native测试程序,通过文件操作接口验证驱动功能。整个过程涵盖了从驱动开发、内核编译到应用测试的完整流程,展示了Linux设备驱动的基本开发方法。

2025-12-11 15:58:19 877

原创 传统 Hal 开发笔记2----传统 HAL 整体架构

本文分析了Android系统中App访问硬件设备(以振动器为例)的流程。首先通过getSystemService()方法获取系统服务,最终由SystemServiceRegistry注册并管理各类服务。对于振动器服务,系统会创建SystemVibrator对象,通过Binder机制与底层VibratorService通信。VibratorService再通过JNI调用HAL层库函数,最终通过Linux系统调用操作硬件驱动。整个流程展示了Android系统从应用层到硬件驱动的完整调用链,体现了系统服务注册机制

2025-12-10 17:04:31 1045

原创 传统 Hal 开发笔记1----传统 HAL简介

本文介绍了Android 8之前的传统HAL开发流程。传统HAL以so库形式存在,Framework通过JNI加载,并以Binder服务向App提供硬件接口。开发步骤包括:编写Linux驱动、实现HAL模块、修改JNI加载代码、添加硬件服务模块,最后开发App调用硬件服务。该流程展示了从底层驱动到上层应用的完整HAL开发过程。

2025-12-09 15:23:31 216

原创 安卓Telephony中的 phoneId、subId、simSlotIndex含义对比

摘要: Android多SIM卡管理涉及三个关键标识符:subId(订阅ID)、simSlotIndex(SIM卡槽索引)和phoneId(手机ID)。subId是逻辑订阅标识,用于区分运营商服务;simSlotIndex对应物理卡槽位置;phoneId表示底层modem标识。获取方式主要通过SubscriptionManager和TelephonyManager服务,需要READ_PHONE_STATE权限。开发者应优先使用subId和simSlotIndex进行SIM卡操作,phoneId主要用于系统内

2025-11-14 10:46:53 699

notepad++ 前进后退插件

功能主治:该插件适用于notepad++的前进后退功能 适用人群:卑微的码农

2024-02-01

空空如也

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

TA关注的人

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