皮皮网

皮皮网

【e语言源码合集】【gdb导出源码】【安全源码大全】安卓local类源码_android dialog源码

时间:2024-12-26 01:48:26 分类:热点

1.如何自动设好Android.mk的LOCAL
2.Vert.x 源码解析(4.x)——Local EvnentBus入门使用和源码解析

安卓local类源码_android dialog源码

如何自动设好Android.mk的LOCAL

       ã€€ã€€ç”¨Cocos2d-x开发Android游戏时,需要在Android.mk文件中,为LOCAL_SRC_FILES变量指定要编译的源代码,以及为LOCAL_C_INCLUDES变量指定头文件。当项目文件越来越多时,这种手动修改很浪费时间。好在Android.mk其实就是一个makefile,我们可以借助makefile语法来自动完成这部分工作。

       ã€€ã€€ä½¿ç”¨å¤–部命令

       ã€€ã€€æœ€ç®€å•çš„方式就是调用shell外部命令。首先我们指定要搜索的源文件根目录,设为SRC_ROOT这个变量。LOCAL_C_INCLUDES变量直接就是用find <path> -type d命令去搜索根目录下的目录。LOCAL_SRC_FILES稍微复杂一些,首先我们先用find <path> -type f得到所有的普通文件路径,再指定源代码文件名的匹配模式(例如我用的是c++,所以我指定了变量SRC_SUFFIX存放一般c++源代码文件的后缀名),用filter命令筛选出所有的源代码文件路径。

       ã€€ã€€å®Œæ•´çš„代码如下:

       ã€€ã€€# WARNING: Shell command is 安卓used, it is only works on a UNIX-like OS.

       ã€€ã€€# Replace it with Makefile rules if you want to run on Windows.

       ã€€ã€€SRC_SUFFIX := *.cpp *.c

       ã€€ã€€SRC_ROOT := $(LOCAL_PATH)/../../Classes

       ã€€ã€€ALL_FILES := $(shell find $(SRC_ROOT) -type f)

       ã€€ã€€SRC_FILES := $(filter $(subst *,%,$(SRC\_SUFFIX)),$(ALL_FILES))

       ã€€ã€€LOCAL_SRC_FILES := hellocpp/main.cpp

       ã€€ã€€LOCAL_SRC_FILES += $(SRC\_FILES:$(LOCAL_PATH)/%=%)

       ã€€ã€€SRC_DIRS := $(shell find $(SRC_ROOT) -type d)

       ã€€ã€€LOCAL_C_INCLUDES := $(SRC_DIRS)

       ã€€ã€€ä½¿ç”¨çº¯Makefile语法

       ã€€ã€€ä½¿ç”¨å¤–部命令是最简单实用的解决方案,但正如上面的代码注释所提及的,这种方式只能在Unix系统上才能用,对于需要跨平台适用的情况,还是需要采用纯Makefile语法才行。

       ã€€ã€€æˆ‘们知道,Makefile的wildcard命令可以部分实现类似find的功能,例如找到当前目录下的.c文件可以用$(wildcard *.c),可惜wildcard毕竟不够强大,该命令的结果并不包含子目录以下的.c文件。想要实现这一功能,我们可以借用StackOverflow上大神用纯Makefile语法写的递归wildcard:

       ã€€ã€€# recursive wildcard

       ã€€ã€€rwildcard = $(foreach d,$(wildcard $1\*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d)))该rwildcard命令传入两个参数,第一个参数$1是目录,第二个参数$2是匹配模式。该命令首先用$(wildcard $1*)得到目录下的所有文件和一级子目录,再遍历一遍:对于当前$d变量是目录的情况,对$d/目录递归调用rwildcard;对于$d是普通文件的情况,递归调用会因为$(wildcard $d/*)找不到匹配而终止,接下来便调用filter函数对$2的模式进行筛选。

       ã€€ã€€å®Œæ•´çš„代码如下:

       ã€€ã€€SRC_SUFFIX := *.cpp *.c

       ã€€ã€€SRC_ROOT := $(LOCAL_PATH)/../../Classes

       ã€€ã€€# recursive wildcard

       ã€€ã€€rwildcard = $(foreach d,$(wildcard $1\*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d)))

       ã€€ã€€SRC_FILES := $(call rwildcard,$(SRC_ROOT)/,$(SRC_SUFFIX))

       ã€€ã€€LOCAL_SRC_FILES := hellocpp/main.cpp

       ã€€ã€€LOCAL_SRC_FILES += $(SRC\_FILES:$(LOCAL_PATH)/%=%)

       ã€€ã€€ç­›é™¤ä¸éœ€è¦ç¼–译的源代码文件

       ã€€ã€€ä¸Šé¢ä»‹ç»çš„方法有一个适用的前提,那就是$SRC_ROOT下每个源代码文件都需要被编译。而有时候这个条件并不成立,像本渣所在项目中就用到了一些外部库,这些库的源代码是不用被编译的(例如设为ASIO_HEADER_ONLY的Asio库)。这个时候就需要把这部分源代码排除在LOCAL_SRC_FILES之外。

       ã€€ã€€ç¬¬ä¸€ç§æ–¹æ³•ï¼šfilter-out

       ã€€ã€€ç¬¬ä¸€ç§æ–¹æ³•æ˜¯ç”¨Makefile的filter-out命令:

       ã€€ã€€# ASIO library is set as ASIO_HEADER_ONLY, so it will be excluded from source code

       ã€€ã€€EXCLUDE_SRC_FILES := $(SRC_ROOT)/3rdParty/Asio/asio/impl/%.cpp

       ã€€ã€€EXCLUDE := $(filter $(EXCLUDE_SRC_FILES),$(SRC_FILES))

       ã€€ã€€SRC_FILES := $(filter-out $(EXCLUDE_SRC_FILES),$(SRC_FILES))这种方式虽然可行,但是filter-out无法用于多级目录的模式匹配,所以这种方法暴露了太多关于外部库源代码路径的细节。有没有可能指定要排除的库名或关键字,再根据这个信息去筛除匹配的源代码文件呢?

       ã€€ã€€ç¬¬äºŒç§æ–¹æ³•ï¼šæ”¹è¿›rwildcard

       ã€€ã€€ç¬¬äºŒç§æ–¹å¼æ˜¯åœ¨rwildcard中加入一个判断用于筛除:如果当前的目录/文件名匹配到所要筛除的关键字,则什么都不做;否则就继续递归调用和执行filter命令。

       ã€€ã€€# ASIO library is set as ASIO_HEADER_ONLY, so it will be excluded

       ã€€ã€€EXCLUDE_LIB := Asio

       ã€€ã€€# recursive wildcard

       ã€€ã€€rwildcard = $(foreach d,$(wildcard $1\*),$(if $(findstring $(EXCLUDE_LIB),$d),,$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d)))

       ã€€ã€€SRC_FILES := $(call rwildcard,$(SRC_ROOT)/,$(SRC_SUFFIX))这种方式是好一些了,而且直接在递归wildcard搜索时就进行了排除,不过rwildcard变得更复杂了,可读性不佳。

       ã€€ã€€ç¬¬ä¸‰ç§æ–¹æ³•ï¼šFILTER_OUT_PATTERN

       ã€€ã€€æœ€åŽçš„方法也来自于StackOverflow大神用纯Makefile语法改造过的filter-out,不过本质上和第二种方法的实现是类似的,这里就不详细解释了:

       ã€€ã€€# ASIO library is set as ASIO_HEADER_ONLY, so it will be excluded from source code

       ã€€ã€€EXCLUDE_SRC_PATTERN := asio

       ã€€ã€€FILTER_OUT_PATTERN = $(foreach v,$(2),$(if $(findstring $(1),$(v)),,$(v)))

       ã€€ã€€SRC_FILES := $(call FILTER\_OUT\_PATTERN,$(EXCLUDE_SRC_PATTERN),$(SRC_FILES))

Vert.x 源码解析(4.x)——Local EvnentBus入门使用和源码解析

       Vert.x 源码解析(4.x)——Local EvnentBus入门使用和源码解析

       本文将介绍使用和解析Vert.x的本地事件总线(Local EvnentBus)的基本概念、入门使用方法以及源码解析。源码g源

       1. 简介

       Vert.x EventBus是安卓一个用于异步通信的分布式事件总线,支持在同个Vert.x应用程序内部或跨多个Vert.x应用程序之间的源码g源消息交互,实现组件、安卓模块或服务之间的源码g源e语言源码合集松耦合与高度可扩展性。

       2. 基本概念

       EventBus分为Local模式和Clustered模式,安卓Local模式适用于项目内部通信,源码g源而Clustered模式用于集群间传输。安卓

       3. 入门使用

       3.1 获取EventBus

       每个Vertx实例仅有一个EventBus实例,源码g源可使用注册处理器、安卓调用consumer()方法获取MessageConsumer对象。源码g源

       在集群模式下注册处理器时,安卓注册信息传播至集群中所有节点可能需要时间。源码g源

       3.2 注销处理器

       通过unregister方法注销处理器,安卓在集群模式下,此动作传播至节点可能需要额外时间,gdb导出源码可使用回调完成通知。

       3.3 发布消息

       使用publish方法指定地址发布消息,消息将传递给所有在该地址注册的处理器。

       3.4 发送消息

       使用send方法发送消息至指定地址的单个处理器。

       3.5 设置消息头

       在发送或publish消息时可提供DeliveryOptions来设置头信息。

       3.6 消息顺序

       消息按发送顺序传递给处理器。

       3.7 消息对象

       消息处理器接收到的对象类型为Message,包含消息体和头信息。安全源码大全

       3.8 应答消息/发送回复

       通过reply方法在处理器接收到消息后发送回复至消息来源,确认处理。

       3.9 带超时的发送

       使用DeliveryOptions指定超时时间,若超时未收到回复,则调用应答处理器。

       3. 发送失败

       消息发送失败时,应答处理器将接收到异常失败结果。

       3. 消息编解码器

       注册消息编解码器支持发送任何对象,spring源码开源通过DeliveryOptions指定对象类型。

       3. 集群模式的Event Bus

       将多个Vert.x实例组合为集群,实现分布式Event Bus。

       4. 关键类简介

       4.1 主要类的作用

       EventBus、EventBusInternal、EventBusImpl: EventBus接口定义方法,EventBusImpl实现管理消息、监听器注册、赢家指标源码消息派发等功能,异步操作。

       HandlerRegistration、MessageConsumerImpl: 消费者实现类,管理订阅关系与消息派发。

       DeliveryContextBase、InboundDeliveryContext、OutboundDeliveryContext: 消息传递管理类,处理发送和接收过程。

       4.2 EventBus系列

       EventBus、EventBusInternal: EventBus接口,EventBusImpl实现。

       4.3 MessageConsumer系列

       MessageConsumerImpl实现消息消费与订阅管理。

       4.4 DeliveryContext系列

       DeliveryContextBase管理消息传递过程,InboundDeliveryContext处理接收消息,OutboundDeliveryContext处理发送消息。

       4.5 Message系列

       Message实现消息对象,MessageImpl具体实现。

       4.5.3 MessageCodec系列

       CodecManager获取解码器,lookupCodec方法实现消息解码。

       5. Local模式EventBus源码解析

       5.1 consumer方法分析

       绑定时调用consumer方法,创建MessageConsumerImpl实例。

       5.2 handler

       注册处理器,涉及HandlerRegistration、EventBusImpl等类。

       5.3 send

       发送消息,EventBusImpl类实现,包括创建消息、发送上下文等。

       5.4 reply

       回复消息,与send方法类似。

       5.5 总结

       本地事件总线操作简单,消息发布与发送遵循明确的步骤。回复消息与发送类似,关键在于消息处理与应答机制。