基于android2.3.5系统:Android中native层C++单例模式

数据库:关系运算整理大全(包括关系代数、元组关系演算、域关系演算) 数据库关系运算: 1. 关系代数(基本关系代数、附加关系代数、扩展关系代数) 2. 元组关系演算 3. 域关系演算 阅读详情

***************************************************************************************************************************
作者:EasyWave                                                                                 时间:2013.02.16

类别:Android系统源码分析                                                              声明:转载,请保留链接

注意:如有错误,欢迎指正。这些是我学习的日志文章......

***************************************************************************************************************************

一:什么是单例模式

       单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。单例模式有许多种实现方法,在C++中,甚至可以直接用一个全局变量做到这一点。使用全局对象能够保证方便地访问实例,但是不能保证只声明一个对象——也就是说除了一个全局实例外,仍然能创建相同类的本地实例。《设计模式》中文版一书中给出了一种很不错的实现,在84页开始讲这个单例模式。具体的可以参考书中所说。

二:单例模式的优点

1) 对唯一实例的受控访问

       因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它。
2) 缩小名空间

      Singleton模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染名空间。
3) 允许对操作和表示的精化

        Singleton类可以有子类,而且用这个扩展类的实例来配置一个应用是很容易的。你可以用你所需要的类的实例在运行时刻配置应用。
4) 允许可变数目的实例

       这个模式使得你易于改变你的想法,并允许Singleton类的多个实例。此外,你可以用相同的方法来控制应用所使用的实例的数目。只有允许访问Singleton实例的操作需要改变。
5) 比类操作更灵活

        另一种封装单件功能的方式是使用类操作(即C + +中的静态成员函数或者是Smalltalk中的类方法)。但这两种语言技术都难以改变设计以允许一个类有多个实例。此外,C++中的静态成员函数不是虚函数,因此子类不能多态的重定义它们。

三:Android系统中实现的单例模式

      在Android系统中,我们可以在很多地方看到这种设计模式,比如ProcessState类、IPCThreadState类等。我们还是来看看他们的实现代码吧。在frameworks\base\libs\binder\ProcessState.cpp文件中我们可以看到如下的定义:

而sp<ProcessState> self()定义是在frameworks\base\include\binde\ProcessState.h文件中,如下:

       仔细看红色圈中的部分,从上面的代码中,我们看出这是一个典型的C++的单例模式,gProcess是在Static.cpp中定义的,用户访问唯一实例的方法只有self()成员函数。如果不通过这个函数,任何创建实例的尝试都将失败,因为类的构造函数是私有的。self()使用懒惰初始化,也就是说它的返回值是当这个函数首次被访问时被创建的。这是一种防弹设计——所有self()之后的调用都返回相同实例的指针,那么它是如何调用的呢?如下:[在frameworks\base\cmds\app_process\App_main.cpp]

在Andriod中,还有一个地方,这里需要特别的说说,就是在frameworks\base\libs\binder\IPCThreadState.cpp文件中,这个关于binder的进程间通信的类函数集合。它的调用方式采用了TLS,也就是线程局部存储(Thread Local Storage,TLS)。Andriod是一个多线程的系统,每个线程除了共享进程的资源外还拥有各自的私有资源:
一个寄存器组(或者说是线程上下文);
一个专属的堆栈;
一个专属的消息队列;
一个专属的Thread Local Storage(TLS);
一个专属的结构化异常处理串链。

这里重点关注Thread Local Storage,我们还是来看看具体的代码实现吧,如下:

       不错,pthread_getspecific()和pthread_key_create()函数就是一个关于TLS相关的函数。详细的关于线程的概念,请参考:《POSIX多线程程序设计》这本书。这本书详细的解释了Linux下的线程的概念。这里采用了TLS来作为用户访问唯一实例。这个地方用的非常巧妙...... 深入的知识点就不说了......

如何调用呢?请看frameworks\base\core\jni\android_util_Binder.cpp中的static void android_os_Parcel_enforceInterface(JNIEnv* env, jobject clazz, jstring name)函数,如下:

      在Andriod的源码中,很多地方采用可复用面向对象软件的设计模式,所以,建议还是先看看《设计模式精解-GoF 23 种设计模式解析附 C++实现源码》,可以在下面的地址下载,分C++版和Java版:

C++版:http://wenku.baidu.com/view/69b6c04b2b160b4e767fcff5.html

Java版:http://wenku.baidu.com/view/bbf5e9d633d4b14e85246884.html 

基于多传感器融合的智身四足机器狗楼梯环境SLAM系统设计与实现 本文设计了一种基于多传感器融合的四足机器狗楼梯环境SLAM系统。系统采用Jetson Orin NX为主控制器,集成RealSense D435i深度相机和Livox Mid360激光雷达,在ROS2框架下实现平面定位精度<5cm、楼梯环境下导航不漂移的目标。通过多层次传感器融合策略、运动学约束优化和状态切换机制,解决了楼梯环境下的定位累积误差问题,实现了平面与楼梯环境的自动识别切换及精度复位功能。硬件设计注重传感器布局优化和精确标定,软件架构采用分层设计,确保实时性能。该系统为四足机器人在复杂地形中 阅读详情

相关推荐

海康读码器上位机开发避坑指南:IDMVS客户端之外,如何用C# SDK搞定扫码、数据比对与实时控制?

本文详细介绍了如何利用海康读码器的C# SDK进行二次开发,实现从基础扫码到复杂工业控制的全流程解决方案。内容涵盖SDK架构解析、多设备管理系统构建、业务逻辑与设备控制实现,以及系统集成与性能优化等关键环节,为工业自动化领域的开发者提供实用指南。

weixin_30642561的博客 549

C++ 单例模式

新建SingleTon.h class SingleTon { private: static SingleTon* instance; SingleTon(); public: static SingleTon* getInstance(); }; 新建SingleTon.cpp #include "SingleTon.h" SingleTon* SingleTon::instance ...

朱豪凯的博客 315

华为云Stack 8.X 流量模型分析(一)

​ 当内部需要提供对外服务时(如对外发布Web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。​ 内部地址要访问公网上的服务时(如Web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。

Ciyaso的博客 3240

安卓分层

Android的分4层,java应用程序,java框架,本地框架和java运行环境,Linux内核空间 Native层就是本地框架。Java应用程序无需过多解释,基本可以理解为各个App,由Java语言实现。 Java框架层就是常说的Framework,这层里东西很多也很复杂,比如说主要的一些系统服务如ActivityManagerService、PackageManagerService等,

s546725246的专栏 1223

博途WinCC上位机避坑指南:从工控机选型到趋势图优化的完整流程

本文详细解析了博途WinCC上位机开发全流程,从工控机选型到趋势图优化的关键技巧。针对工业自动化场景,提供硬件配置指南、网络优化方案和性能提升策略,帮助工程师避开常见陷阱,实现稳定高效的HMI系统部署。特别强调PC Station与传统触摸屏的选型对比及SIMATIC NET配置优化。

pp12345的博客 277

隐藏技巧!用ArcGIS Pro像素编辑器实现PS级影像编辑(附地貌伪装案例)

本文深入探讨ArcGIS Pro像素编辑器的创意应用,从基础操作到高级影像处理实战,展示了其在城市规划、环境分析等领域的独特价值。通过详细的功能解析和地貌伪装等案例,帮助用户实现媲美专业图像处理软件的精细操作,提升GIS工作效率。

weixin_28520495的博客 335

问题: Your project contains C++ files but it is not using a supported native build system.解决方法

问题出现: 将eclipse项目导入android studio后由于项目中有用到jni层中的东西,在将一系列可见错误解决后运行APP出现了标题中所述问题。 1、网上最常见的解决方案 参考链接 一、在项目的gradle.properties添加 android.useDeprecatedNdk=true 二、在module的build.gradle(Module:app)的buildTypes上...

fighting_2017的博客 1345

【全开源】旅游系统源码(Uniapp+FastAdmin+ThinkPHP)

通过源码的灵活配置和定制开发,我们可以根据旅游企业的实际需求,快速构建出符合其业务特点的旅游系统。旅游系统源码,作为这一变革的基石,为旅游业的数字化转型提供了强有力的支撑。通过深入研究和应用旅游系统源码,我们能够构建出更加智能、便捷、个性化的旅游服务平台,满足游客日益增长的旅游需求。国际化发展:随着全球化的深入发展,旅游系统源码也将迎来国际化的发展机遇,为国内外游客提供更加便捷、高效的旅游服务。跨界融合:旅游系统源码将与更多领域进行跨界融合,如与交通、餐饮、购物等行业的结合,为游客提供更加丰富的旅游体验。

2401_84413757的博客 2147

Error: Your project contains C++ files but it is not using a supported native build system.

1.错误描述 Error:Execution failed for task ':app:compileDebugNdk'. > Error: Your project contains C++ files but it is not using a supported native build system. Consider using CMake or ndk-build ...

牛八少爷的专栏 527

VSAN 虚拟机丢失排查与恢复完整方案

VSAN虚拟机(含vCenter)显示无效 检查存储状态:登录ESXi Host Client,确认VSAN存储是否挂载。 若未挂载,通过SSH执行 手动挂载。 验证文件存在:检查虚拟机文件是否完整。 解除文件锁定:删除残留的 .lck 文件 手动注册虚拟机:强制注册虚拟机配置文件。 检查VSAN健康:验证集群节点在线、磁盘组状态正常,并测试节点间网络。 修复元数据:针对损坏对象,谨慎执行修复。 终极恢复:若数据丢失,从备份还原或联系VMware支持,提交日志

sido777的博客 2679

单细胞测序数据读取实战指南:从入门到精通

本文提供了单细胞测序数据读取的实战指南,涵盖从标准10X Genomics格式到通用表达矩阵及RDS文件的读取方法。文章重点解析了数据读取的核心步骤、常见问题解决方案及进阶技巧,旨在帮助用户夯实数据分析基础,确保后续分析流程的准确性。

weixin_29095587的博客 459

Your project contains C++ files but it is not using a supported native build system

NDK工程建立后,运行出现Your project contains C++ files but it is not using a supported native build system的报错: 解决方案如下: 1. 在项目的gradle.properties添加 android.useDeprecatedNdk=true 2. 在module的build.gradle(Modu...

qq_20369621的博客 417

Open3D 进阶(32)渐进三角网(PTD)地面滤波

渐进三角网地面滤波算法(Progressive TIN Densification, PTD)是一种广泛应用于机载LiDAR点云数据处理的滤波方法,旨在从复杂场景中精确分离地面点,以生成数字高程模型(DEM)。

点云侠的博客 1533

Grok接入CarPlay:车载AI交互范式的临界点

车载AI不是简单将大模型API搬上车机,而是需兼顾低延迟响应、长上下文理解与驾驶安全约束的系统工程。其核心原理在于端-边-云协同推理架构,通过本地Neural Engine预处理、边缘节点量化模型加速、云端深度回溯三级调度,在1.6秒安全视线阈值内完成语义闭环。技术价值体现在真正实现跨任务记忆、模糊意图识别与无感状态同步,支撑通勤规划、紧急响应、儿童安抚等高黏性驾驶场景。Grok与CarPlay的深度融合,标志着车载交互从‘功能投屏’迈向‘协议级智能’,成为当前唯一落地‘真智能’体验的开源大模型实践。

558

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Gemini网页版真实入口与小白避坑指南

Gemini网页版是Google官方提供的免安装AI助手服务,基于持续迭代的Gemini模型(非独立‘3.1 Pro’版本),主打低门槛、强上下文记忆与多模态文件理解能力。其核心价值不在于参数堆砌,而在于将大模型能力通过极简交互稳定交付——支持PDF/图片直传解析、自然语言提问、跨轮对话连贯响应,适用于办公写作、文档摘要、PPT策划等高频生产力场景。用户常遇的‘打不开’‘满血失效’等问题,90%源于DNS污染、浏览器扩展拦截或企业防火墙策略,而非服务本身故障。本文聚焦真实可用入口识别、零基础三步登录法及典型

weixin_34293246的博客 692

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

华为Mate50账号锁原理与官方解绑全指南

华为账号锁是基于TEE可信执行环境与云服务协同的设备所有权验证机制,属于移动设备安全体系中的硬件级激活锁范畴。其原理类似苹果iCloud激活锁,但采用‘华为账号+IMEI/MEID+TEE签名密钥’三元认证,确保无原始凭证无法绕过。该机制在HarmonyOS设备(如Mate50)中默认启用‘查找设备’功能后自动生效,技术价值在于防止设备丢失后被非法重用,广泛应用于二手交易风控、维修合规校验及企业资产管理场景。本文聚焦华为Mate50机型,详解账号锁触发逻辑、官方解绑实操路径及高危非官方方案风险。

weixin_30800987的博客 408

【Android NDK 开发】在 C 代码中获取 Android 系统信息 ( NDK 项目创建 | NDK 配置 | 获取 Android 系统版本号 )

文章目录创建 NDK 项目NDK 项目 相关配置NDK 中获取 Android 版本号 创建 NDK 项目 1. 创建支持 NDK 的项目 : 当前最新的 Android Studio 支持直接创建 支持 C/C++ 的带 NDK 配置的项目 ; 如果向现有项目加入 C/C++ 代码 , 首先要创建 cpp 代码文件 , 然后创建 CMakeList.txt 编译脚本 , 最后在 bui...

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 4914

Your project contains C++ files but it is not using a supported native...

Android Studio配置NDK时出现问题: Error: Your project contains C++ files but it is not using a supported native build system. Consider using CMake or ndk-build integration. For more information, go to: https...

Errol's Blog 2307

如何解决Your project contains C++ files but it is not using a supported native build system

最近因为项目需要下载Android终端模拟器(Android-Terminal-Emulator)源码进行调试编译,编译过程中出现报错 Error:Execution failed for task ':libtermexec:compileReleaseNdk'. > Error: Your project contains C++ files but it is not usin...

weixin_30471065的博客 332

Error: Your project contains C++ files but it is not using a supported native build system

我在导入android studio 代码的时候运行报错: Error:Execution failed for task ':app:compileDebugNdk'. > Error: Your project contains C++ files but it is not using a supported native build system. Consider using

qq_29586601的博客 296

Android 设计模式 之 单例模式

1、单例模式常见情景 设计模式中,最简单不过的就是单例模式。先看看单例模式 原文:http://www.iteye.com/topic/575052 Singleton模式可以是很简单的,它的全部只需要一个类就可以完成(看看这章可怜的UML图)。但是如果在“对象创建的次数以及何时被创建”这两点上较真起来,Singleton模式可以相当的复杂,比头五种模式加起来还复杂,譬如涉及到DCL

fangchongbory的专栏 6845

单例模式android应用场景,应用最广的模式-单例模式(结合Android源码)

谈起设计模式估计大家都不会陌生,一个项目中至少会用到其中的一种模式,今天要说的主角就是单列,我了大致总结了它的几种用法同时也结合了Android的源码进行单列的分析;好了正题开始了,其实个人总结了下自我学习的方法,在学习任何一个新的事物的时候,不能盲目的去干,而应适当的采取一定的技巧性东西,OK;我大致分了三大步:1:要知道这个东西是个什么玩意,这个东西有啥用,一般用在啥地方;2:这个东西该怎么用...

weixin_36438028的博客 345

Android Studio:Your project contains C++ files but it is not using a supported native build system.

 Error: Your project contains C++ files but it is not using a supported native build system.   Consider using CMake or ndk-build integration. For more information, go to:    https://d.android.com/r/...

牛八少爷的专栏 1827

Jni报错: Error: Your project contains C++ files but it is not using a supported native build system

jni初始配置参见 https://blog.csdn.net/mabeijianxi/article/details/68525164我用的第二种方法,报错Error: Your project contains C++ files but it is not using a supported native build system解决办法:在文件build.gradle(Module:app...

yvhkyiu的专栏 991

Your project contains C++ files but it is not using a supported native build system.

异常如下 Error:Execution failed for task ':xdySDKddd:compileDebugNdk'. > Error: Your project contains C++ files but it is not using a supported native build system. Consider using CMake or ndk-build inte

hutubeyond的博客 963
上一篇: 基于android2.3.5系统:开天辟地Android启动机制[四]
下一篇: 基于android2.3.5系统:explicit关键字应用方法详解
wang-bob
博客等级 码龄20年 356粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值