首页 文章 精选 留言 我的

精选列表

搜索[HTTP/2],共10000篇文章
优秀的个人博客,低调大师

《社交网站界面设计(原书第2版)》——1.15 让交互更有人情味

1.15 让交互更有人情味 为这些新物理接口创建自然的交互可以降低屏幕的重要性。随着物联网逐渐扩展到生活的空间、物体,甚至是周围的人,我们应该将交互移出屏幕并移动到我们周围的环境中。屏幕将人们彼此分隔。我们越是连通,我们与周围的人和场所越是分隔。在餐桌、床、办公室和街上,我们都是低头看着我们的设备,而不是抬头看着这个世界。我们可以做得更好。通过包含(结合)传感器,现在我们拥有了一个创造交互的新机会,它符合我们与世界交互的方式。——约什·克拉克(Josh Clark)

优秀的个人博客,低调大师

《Android的设计与实现:卷I》——第2章 2.2.3Log系统的JNI方法注册

2.2.3 Log系统的JNI方法注册 JNI层已经实现了Java层声明的Native方法。可这两个方法又是如何联系在一起的呢?我们接着分析android_util_Log.cpp的源码。定位到以下部分:static JNINativeMethod gMethods[] = { { "isLoggable", "(Ljava/lang/String;I)Z", (void) android_util_Log_isLoggable }, { "println_native", "(IILjava/lang/String;Ljava/lang/String;)I", (void*) android_util_Log_println_native }, };这里定义了一个数组gMethods,用来存储JNINativeMethod类型的数据。 可以在jni.h文件中找到JNINativeMethod的定义: 可见,JNINativeMethod是一个结构体类型,保存了声明函数和实现函数的一一对应关系。 下面分析gMethods[0]中存储的对应信息:{ "isLoggable", "(Ljava/lang/String;I)Z", (void) android_util_Log_isLoggable }Java层声明的Native函数名为isLoggable。Java层声明的Native函数的签名为(Ljava/lang/String;I)Z。JNI层实现方法的指针为(void) android_util_Log_isLoggable。 至此,我们给出了Java层方法和JNI层方法的对应关系。可如何告诉虚拟机这种对应关系呢?继续分析android_util_Log.cpp源码。定位到以下部分:int register_android_util_Log(JNIEnv env){ jclass clazz = env->FindClass("android/util/Log"); levels.debug = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "DEBUG", "I")); …… return AndroidRuntime::registerNativeMethods(env, "android/util/Log", gMethods, NELEM(gMethods)); 这个函数最后调用了AndroidRuntime::registerNativeMethods,并将gMethods数组、Java层类名以及一个JNIEnv类型的指针一同传给registerNativeMethods。 初次接触JNI的读者可能有这样的疑问:这是在做什么?JNIEnv是什么?为什么找遍android_util_Log.cpp源码都没找到这个函数是在哪里调用的? 我们先来分析这个函数是做什么的。 第一个问题:registerNativeMethods函数的作用是什么? 既然registerNativeMethods是AndroidRuntime中定义的函数,打开AndroidRuntime.cpp文件,定位到registerNativeMethods函数,其代码如下:int AndroidRuntime::registerNativeMethods(JNIEnv env, const char className, const JNINativeMethod gMethods, int numMethods) { return jniRegisterNativeMethods(env, className, gMethods, numMethods); }这里仅仅是对jniRegisterNativeMethods的封装,可以在头文件JNIHelp.h中找到该方法的定义://注册特定类的一个或多个Native方法 int jniRegisterNativeMethods(C_JNIEnv env, const char className,const JNINativeMethod gMethods, int numMethods);接着看这个方法是怎么实现的。打开JNIHelp.cpp,代码如下:extern "C" int jniRegisterNativeMethods(C_JNIEnv env, const char* className, const JNINativeMethod* gMethods, int numMethods) { JNIEnv e = reinterpret_cast<JNIEnv*>(env); scoped_local_ref<jclass> c(env, findClass(env, className)); …… if ((env)->RegisterNatives(e, c.get(), gMethods, numMethods) < 0) { LOGE("RegisterNatives failed for '%s', aborting", className); abort(); } return 0; }这里最终调用了JNIEnv的RegisterNatives函数,将gMethods中存储的方法关联信息传递给Dalvik虚拟机。在jni.h中找到RegisterNatives的方法原型如下:jint RegisterNatives(JNIEnv env, jclass clazz,? const JNINativeMethod *methods, jint nMethods); 其作用是向clazz参数指定的类注册本地方法。这样,虚拟机就得到了Java层和JNI层之间的对应关系,就可以实现Java和C/C++代码的互操作了。 第二个问题:JNIEnv是什么? 为了不打断读者的思路,将在下节详细介绍JNIEnv是什么。这里读者只需要知道,JNIEnv是一个指针,指向了一组JNI函数,通过这组函数可以在JNI层操作Java对象,以此实现Java层和native层互操作。 第三个问题:register_android_util_Log函数是在哪里调用的? 这个问题涉及JNI部分代码在系统启动过程中是如何加载的,这已经超出了本章的知识范围,我们将在启动篇详细介绍这个过程。在这里,读者只需要知道这个函数是在系统启动过程中通过AndroidRuntime.cpp的register_jni_procs方法执行的,进而调用到register_android_util_Log将这种函数映射关系注册给Dalvik虚拟机的。 注意 使用JNI有两种方式:一种是遵守JNI规范的函数命名规范,建立声明函数和实现函数之间的对应关系;另一种是就是Log系统中采用的函数注册方式。应用层多采用第一种方式,应用框架层多采用第二种方式。 至此,Log系统就可以正常使用JNI提供的接口访问系统底层提供的服务了。下面,将对Log系统中涉及的JNI技术进行详细讲解。

优秀的个人博客,低调大师

8月2日云栖精选夜读:微服务架构的分布式事务解决方案

分布式事务是一个绕不过去的挑战!微服务架构本质上就是分布式服务化架构,微服务架构的流行,让分布式事务问题日益突出!尤其是在订单业务、资金业务等系统核心业务流程中,一定要有可靠的分布式事务解决方案来保证业务数据的可靠性和准确性。 热点热议 微服务架构的分布式事务解决方案 作者:调皮仔3683 共享单车物联网应用重心从智能锁转移到电子围栏 作者:gunser CentOS6.5 Redis3.x集群安装配置 作者:怀远西 知识整理 Hdoop 3.0 分布式配置 作者:wilnd 不容忽略的10大顶级网络安全技术 错过就是过错! 作者:祁同伟 Mybatis传参总结 作者:浦涛 E-MapReduce HDFS文件快速CRC校验工具介绍 作者:hadoop 发表在:阿里云E-MapReduce Logstash详解之——filter模块 作者:ritit 美文回顾 SpringBoot开发案例之奇技淫巧 作者:小柒2012 一个复杂系统的拆分改造实践 作者:力君 发表在:阿里巴巴客户体验驱动及创新中心 在阿里云上进行Docker应用的自动弹性伸缩 作者:长海长歌 发表在:阿里云容器服务 spanner 的前世今生 作者:raymondshiquan 发表在:阿里云容器服务 Spring beans架构设计原理--set注入 作者:鹰波 手把手教你编写入门级redis客户端 作者:数据价值 JVM源码分析之System.currentTimeMillis及nanoTime原理详解 作者:寒泉子 往期精选回顾 8月1日云栖精选夜读:独家:阿里巴巴DevOps落地实践玩法及思路解析 7月31日云栖精选夜读:金融安全资讯精选 2017年第一期:云战略下的安全思维转型与新认知 7月28日云栖精选夜读:【上报纸啦】95后大学生用机器学习PAI大战老年痴呆 7月27日云栖精选夜读:AI时代,运维和测试岗位如何开启"第二春"? 7月26日云栖精选夜读:MySQL金融版线上发布会:它为什么是金融企业的首选,技术大佬、产品和神秘嘉宾本位“演绎”

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册