好用的h5网站在线网站地图生成器

pingmian/2025/10/7 22:32:06/文章来源:
好用的h5网站,在线网站地图生成器,wordpress+手机端,怎么把做的网页放网站HwBinder与普通Binder是一样的,区别是前者是专门给硬件使用#xff0c;后者是给一般的应用程序使用#xff0c;为了不影响现有的binder#xff0c;单独增加硬件的HwBinder来实现硬件相关进程的通信。 HwBinder也是有四部分组成#xff1a;hwservermanager、server、client…    HwBinder与普通Binder是一样的,区别是前者是专门给硬件使用后者是给一般的应用程序使用为了不影响现有的binder单独增加硬件的HwBinder来实现硬件相关进程的通信。 HwBinder也是有四部分组成hwservermanager、server、clientdriver其中Driver部分与普通Binder是一样的《Android图形显示系统》对Binder的原理进行过详细的介绍这里主要介绍HwBinder与Binder不一样的地方。 服务管理进程 首先是服务管理进程由HwServiceManager服务主要流程如下 /* system/hwservicemanager/service.cpp */ int main() {     ServiceManager *manager new ServiceManager();     if (!manager-add(serviceName, manager)) {}     TokenManager *tokenManager new TokenManager();     if (!manager-add(serviceName, tokenManager)) {} spBnHwServiceManager service new BnHwServiceManager(manager); IPCThreadState::self()-setTheContextObject(service); ProcessState::self()-becomeContextManager(nullptr, nullptr);     joinRpcThreadpool(); } HwServiceManager与ServiceManager不一样的地方是hwservicemanager有Binder节点并把Binder节点通过setTheContextObject传给了驱动并且使用IPCThreadState把主线程加入到线程池来循环处理请求。意味着HwServiceManager是支持并发访问的可以同时处理多个请求 服务进程 Server的开发比较简单service.cpp的实现比较简单如下所示。 int main() {     return defaultPassthroughServiceImplementationIDemo(); } defaultPassthroughServiceImplementation的实现流程如下。 /* system\libhidl\transport\include\hidl\LegacySupport.h*/ templateclass Interface __attribute__((warn_unused_result)) status_t defaultPassthroughServiceImplementation(size_t maxThreads 1) {     return defaultPassthroughServiceImplementationInterface(default, maxThreads); } templateclass Interface __attribute__((warn_unused_result)) status_t defaultPassthroughServiceImplementation(std::string name,                                             size_t maxThreads 1) {     configureRpcThreadpool(maxThreads, true);     status_t result registerPassthroughServiceImplementationInterface(name);     joinRpcThreadpool();      return UNKNOWN_ERROR; } templateclass Interface __attribute__((warn_unused_result)) status_t registerPassthroughServiceImplementation(         std::string name default) {     spInterface service Interface::getService(name, true /* getStub */);     status_t status service-registerAsService(name);     return status; } 最后调registerPassthroughServiceImplementation来注册服务把Interface替换成IDemo得到以下。 __attribute__((warn_unused_result)) status_t registerPassthroughServiceImplementation(         std::string name default) {     spIDemo service IDemo::getService(name, true /* getStub */);     status_t status service-registerAsService(name);     return status; } 调用的是IDemo的接口getService得到IDemo节点通过registerAsServie来添加到服务管理HwServiceManager。 IDemo::getService在DemoAll.cpp实现该文件是自动生成的路径如下 out/soong/.intermediates/hardware/interfaces/demo/1.0/android.hardware.demo1.0_genc/gen/android/hardware/demo/1.0/DemoAll.cpp  ::android::spIDemo IDemo::getService(const std::string serviceName, const bool getStub) { return ::android::hardware::details::getServiceInternalBpHwDemo( serviceName, true, getStub); } getService主要通过getServiceInternal来实现继续往下 system\libhidl\transport\include\hidl\HidlTransportSupport.h template typename BpType, typename IType typename BpType::Pure,           typename std::enable_if_tstd::is_samei_tag, typename IType::_hidl_tag::value,           typename std::enable_if_tstd::is_samebphw_tag, typename BpType::_hidl_tag::value spIType getServiceInternal(const std::string instance, bool retry, bool getStub) {     using ::android::hidl::base::V1_0::IBase;     spIBase base getRawServiceInternal(IType::descriptor, instance, retry, getStub);     if (base-isRemote()) {         // getRawServiceInternal guarantees we get the proper class         return spIType(new BpType(toBinderIBase(base)));     }     return IType::castFrom(base); } system\libhidl\transport\ServiceManagement.cpp sp::android::hidl::base::V1_0::IBase getRawServiceInternal(const std::string descriptor,                                                   const std::string instance,                                                   bool retry,  bool getStub) {     const spIServiceManager pm getPassthroughServiceManager();     spIBase base pm-get(descriptor, instance).withDefault(nullptr);     return base; } spIServiceManager1_0 getPassthroughServiceManager() {     return getPassthroughServiceManager1_1(); } spIServiceManager1_1 getPassthroughServiceManager1_1() {     static spPassthroughServiceManager manager(new PassthroughServiceManager());     return manager; } struct PassthroughServiceManager : IServiceManager1_1 {     static void openLibs(         const std::string fqName,         const std::functionbool /* continue */ (void* /* handle */, const std::string /* lib */,                                                  const std::string /* sym */) eachLib) {         const std::string sym HIDL_FETCH_ ifaceName;/     }     ReturnspIBase get(const hidl_string fqName,                           const hidl_string name) override {         spIBase ret nullptr;         openLibs(fqName, [](void* handle, const std::string lib, const std::string sym) {             IBase* (*generator)(const char* name);             *(void **)(generator) dlsym(handle, sym.c_str());            ret (*generator)(name.c_str());            using ::android::hardware::details::getDescriptor;            std::string actualFqName getDescriptor(ret.get());            registerReference(actualFqName, name);         });         return ret;     } } 最终通过遍历so加载得到符号HIDL_FETCH_IDemo并调用得到Demo的对象在Demo.h已经定义 extern C IDemo* HIDL_FETCH_IDemo(const char* name);  在函数前加extern “C”才能使用dlsym 加载到该方法的地址。 下一步Server通过registerAsService把Binder注册到ServiceManager的流程实现还是在DemoAll.cpp里。 out/soong/.intermediates/hardware/interfaces/demo/1.0/android.hardware.demo1.0_genc/gen/android/hardware/demo/1.0/DemoAll.cpp ::android::status_t IDemo::registerAsService(const std::string serviceName) {     const ::android::sp::android::hidl::manager::V1_0::IServiceManager sm              ::android::hardware::defaultServiceManager();     ::android::hardware::Returnbool ret sm-add(serviceName.c_str(), this); } 这里也是通过defaultServiceManager找到ServiceManager的索引对象然后调add接口来添加Demo的对象。 system/hwservicemanager/ServieManager.cpp Returnbool ServiceManager::add(const hidl_string name, const spIBase service) {     auto ret service-interfaceChain([](const auto interfaceChain) {         for(size_t i 0; i interfaceChain.size(); i) {             const std::string fqName interfaceChain[i];             PackageInterfaceMap ifaceMap mServiceMap[fqName];             HidlService *hidlService ifaceMap.lookup(name);             if (hidlService nullptr) {                 ifaceMap.insertService(                     std::make_uniqueHidlService(fqName, name, service, pid));             } else {                 hidlService-setService(service, pid);             }             ifaceMap.sendPackageRegistrationNotification(fqName, name);         }     }); } 在HwServiceManager注册Binder的时候也是需要name的不过是通过interfaceChain来获取Demo Binder对象的name。最后把结果保存到ifaceMap里这里跟ServiceManager只保存Binder的handle也是不一样的。 Server注册服务后Client进程可以查找到Server的binder对象并调用相关的接口来向Server请求服务了 客户进程 接下来是客户进程的流程 int main() {     android::spIDemo service IDemo::getService();     service-sayHello(HIDL !!!, [](hidl_string result) {                 printf(get from server %s\n, result.c_str()); });     return 0; } Client进程主要先调IDemo::getService来得到binder对象并调其方法sayHello把请求发给Server。 Client进程也通过getService获取Demo索引对象跟Server进程获取到的Demo节点对象是不太一样的。 out/soong/.intermediates/hardware/interfaces/demo/1.0/android.hardware.demo1.0_genc_headers/gen/android/hardware/demo/1.0/IDemo.h struct IDemo : public ::android::hidl::base::V1_0::IBase {     static ::android::spIDemo getService(const std::string serviceNamedefault, bool getStubfalse); } Server进程的registerPassthroughServiceImplementation也使用过getService只不过getStub为true这里使用默认参数为false主要是getRawServiceInternal有区别。 system\libhidl\transport\ServiceManagement.cpp sp::android::hidl::base::V1_0::IBase getRawServiceInternal(const std::string descriptor,                                                              const std::string instance,                                                              bool retry, bool getStub) {     const spIServiceManager1_1 sm defaultServiceManager1_1();     for (int tries 0; !getStub (vintfHwbinder || vintfLegacy); tries) {         ReturnspIBase ret sm-get(descriptor, instance);         spIBase base ret;         return base;     } } getStub为false会从ServiceManager来查找服务。 system/hwservicemanager/ServieManager.cpp ReturnspIBase ServiceManager::get(const hidl_string hidlFqName,                                       const hidl_string hidlName) {     const std::string fqName hidlFqName;     const std::string name hidlName;     auto ifaceIt mServiceMap.find(fqName);     const PackageInterfaceMap ifaceMap ifaceIt-second;     const HidlService *hidlService ifaceMap.lookup(name);     spIBase service hidlService-getService();     return service; } Client进程是从HwManager查询回来的索引对象。原理跟普通的binder一样。只不过这里封装的比普通的Binder要复杂。 上面结合一个简单的例子介绍了HIDL的用法并解析了相关的代码HIDL基于hwbinder进行进程间通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

seo网站推广专员招聘手机网站建设wap

对于有些服务端接口返回是固定值的json,可通过配置nginx直接返回json,减少程序的加载对资源的占用,减少接口响应时间 location ~* (request/update)$ { default_type application/json; return 200 {"update":"no&quo…

做建筑设计的网站推荐提升学历选什么专业比较好

科技3D线上云展馆作为一种基于VR虚拟现实和互联网技术的新一代展览平台。可以在线上虚拟空间中模拟真实的展馆,让观众无需亲自到场,即可获得沉浸式的参观体验。通过这个展馆,您可以充分、全面、立体展示您的产品、服务以及各种创意作品&#…

网站建站一本通山西网站制作平台

点、线、边缘检测背景知识。书中主要介绍了图像的一阶导数与二阶导数,这个之前的文章中有过介绍这里在复习一遍。对于函数 ,对于点 在x方向的一阶偏导为:,二阶偏导为:之后书中总结了一阶导与二阶导对于图像求取边缘的结论:孤立点检…

建设部网站危险性较大邮政管理网站建设

结构化查询语言(SQL)是一种广泛使用的工具,用于管理和操作数据库。基本的SQL查询简单易学,但掌握高级SQL技术可以将您的数据分析和管理能力提升到新的高度。 高级SQL技术是指一系列功能和函数,使您能够对数据执行复杂…

优秀网站下载建设网站站点过程中

表达式求值问题 ①问题描述 表达式是数据运算的基本形式。人们的书写习惯是中缀式,如:1122*(7-4)/3。中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。表达式还有后缀式(如:22 7 4 - * 3 / 1…

装修设计案例网站苏州网页设计多少钱

亲爱的猎人:我们将于9月20日0:00对所有大区全部服务器进行更新维护,本次维护预计时间4小时。还请猎人们提早下线,避免不必要的损失。我们将视实际情况提前或延迟开服,感谢大家的支持!维护时间:2016年9月20日(周二)0:00…

网站开发与维护考察试题photoshop破解版下载免费中文版

国外黑客杂志: 《phrack》黑客杂志 http://www.phrack.org 《phrack》创刊于80年代,是世界级的顶级黑客杂志,每年只有一期,现已出了65期,国人似乎至今只有三人在上面发表发表文章,三人好像都是绿盟的人&…

设计图片网站哪个好五金东莞网站建设技术支持

文章目录 一 、前言二、RN与安卓通信2.1 RN 调用安卓原生组件2.2 RN 应用消息机制方式与安卓原生代码切换2.3 RN 应用 Promise 机制与安卓原生代码通信2.4 RN 应用 callback 回调方式与安卓原生代码通信 三、RN与IOS通信3.1 定义导出的方法名3.2 promise 实现回调函数3.3 继承 …

德国建设部网站台州网站设计飞速

在建立数据设计模型时,我们需要注意表设计与类设计之间的差别,这事实上是数据模型与对象模型之间的差别。 数据模型与对象模型 我们首先来分析在设计时对冗余的考虑。前面在讲解数据分析模型时就提及,在确定数据项模型时,需要遵…

本地网站建设软件网站内容优化细节

游戏存档 0.建立游戏存档类 1.建立存档 命名要用规律,读档时根据命名调用 2.读取存档 这里是用存档时间(秒)验证是否有存档成功。 两种鼠标位置射线检测方法 两种适用性未使用大量项目验证,为个人观点 1.适用于游戏中 2.适用于…

广州市南沙建设局网站什么是网站建设有哪些具体内容

文章目录 栈,堆stack object的生命周期static local object的生命周期global object的生命周期heap objects 的生命期new:先分配memory,再调用构造函数delete: 先调用析构函数,再释放 memory动态分配所得的内存块,in V…

dw做网站首页代码有没有catia做幕墙的网站

一、章节内容概述 把管理科学的潜力转变为绩效,主要取决于管理者。要做到这一点,管理者必须理解管理科学是什么以及能够做什么。管理者必须明白,管理科学固有的特殊局限性在很大程度上源于自身的起源和历史。但最重要的是,管理者…

织梦可以做移动网站吗自己做网站引用别人的电影

我们在使用python过程中,为了避免错误删除,会选择做好一个序列后可以插入另外的序列中做为新序列的一部分内容。方便完成一些复杂的工程或多个片段分别编辑后再串成一个完整工程的操作。之前小编向大家介绍了在序列中起到累计作用的reduce函数(https://w…

制作微网站的平台有哪些建各企业网站多少钱

标哥是我的大学老师。标哥也是我们很多学生公认上课非常好的老师,最近标哥突然想见见我这个年轻仔,让我去广州见见他,当然,并不是说他不能来深圳,见面的时候标哥特意给我们解释了一遍,我肯定是能理解他的良…

thinkphp 网站模版合肥html5网站建设

AI智能开发!网站一键复刻!设计稿秒变成品! 相信对很多关注低代码和AI技术的小伙伴来说, 都觉得像这些还只是停留在概念上的技术,很难落地实践。 但是在「织信」已经全部都做到了! 无图无真相&#xff0…

嘉定品牌网站建设做学校网站的济南公司

程序员要保持身心健康,可以注意以下几个方面: 饮食健康:保持均衡的饮食,多吃蔬菜水果,减少油腻和高热量食物的摄入。同时,适当饮水,避免因长时间坐着工作而导致的脱水。尽量不要吃街边摊、大排…

网页源代码提取文件网站优化成功案例

【判断题】重合断面的轮廓线用细实线绘制。【单选题】阿萨德法师法啥【单选题】三相桥式交叉连接电路为限制脉动环流需要( )平衡电抗器【单选题】地方搞活动风格化大发光火【填空题】若s是int型变量,且s6,则表达式s%2(s1)%2的值为________。【填空题】负反馈的作用是( )。【单选…

html网站开发语言建网站 必须学html吗

Functions and Getting Help 在本课中,我们将讨论函数:调用它们,定义它们,并使用Python的内置文档查找它们。 在某些语言中,定义函数必须要有特定的参数,每个参数都具有特定类型。 Python函数允许更灵活。…

邯郸哪个公司做网站好wordpress中文版手册

一、需求分析 旅游网站通常具有多种功能,以下是一些常见的旅游网站功能: 酒店预订:旅游网站可以提供酒店预订服务,让用户搜索并预订符合其需求和预算的酒店房间。 机票预订:用户可以通过旅游网站搜索、比较和预订机票…

大型门户网站建设工作总结网站建设公司做销售好不好

目录SIFT是什么?尺度空间理论SIFT特征点提取SIFT特征点描述SIFT是什么? SIFT ,即尺度不变特征变换( Scale-invariant feature transform,SIFT) ,一种特征描述方法。具有 尺度鲁棒性 旋转鲁棒性 光照鲁棒性 SIFT本身包括了特征点筛选及特征点…