- 博客(13)
- 收藏
- 关注
原创 JNI简介
代表Java虚拟机。所有的工作都是从获取虚拟机接口开始的。有两种方式:第一种方式,在加载动态链接库时,JVM会调用JNI_OnLoad(JavaVM * jvm, void * reserved)(如果定了该函数)。第一个参数会传入JavaVM指针;第二种方式,在native_code中调用JNI_CreateJavaVM(&jvm,(void*)&env,&vm_args) 可以得到JavaVM指针。两种方式都可以用全局变量,比如JavaVM * g_jvm来保存获取到的指针以便在任意上下文中使用。
2026-07-23 15:45:22
225
原创 Binder
ProcessState中执行了打开binder,初始化binder和建立内存映射的操作。并且存储了openbinder的句柄mDriverFD,后续的系统调用函数ioctl都需要mDriverFD作为第一个参数,这样ioctl函数才会正确的调用到binder驱动。还提供了通过handle获取IBinder(BpBinder)的函数,这里的handle是其他进程的Binder句柄,BpBinder可以通过它找到其他进程的Binder,每个BpBinder都对应了一个其他进程的Binder。
2026-07-23 15:43:58
193
原创 Java中几种Map实现
Map是开发中经常用到的一种键-值对的存储结构,在java中有几种常用实现。 HashMap HashMap允许值和value为null,线程不安全。 创建的时候通常用默认的构造方法,还有其他的构造方法可以设置初始大小和负载因子,不设置的话默认初始大小是16,设置的话要求最小是2的4次幂16,最大是2的30次幂,如果设置的值不是2的N次幂,会往上取离它最近的2的N次幂,负载因子是0.75f,当容量大于容器大小x负载因子就会扩容。 HashMap内部是通过Node<K,V>(也有可能.
2020-07-19 02:48:12
814
原创 Binder在Java层的实现
通过Binder在native的实现可以知道Binder通信的本质就是通过Binder共享内存进行跨进程通信,所以Java层还是利用这个进行通信的,只是Client和Server内部的一些执行逻辑有变化,我们直接来看Java层是如何与Binder通信的就可以了。 Java系统服务的创建过程 Java系统服务在Android启动过程中由ServiceThread启动,以power系统服务为例,PowerManagerService继承自Stub类,Stub是定义在IPowerManager接口..
2020-07-18 01:52:21
793
原创 Binder在Native的实现
android中的跨进程通信(ipc)用的是C/S体系系统,Binder为这个体系系统提供IPC通信能力。 在android的C/S体系中增加了一个组件servicemanager,提供注册和检索Service的功能。Service在启动过程中将自身信息注册到servicemanager,servicemanager中维护了一个Service信息的列表,Client在使用服务时,可以通过名字像servermanager获取对应Service信息。servicemanager由init启动的进程,本身也是个
2020-07-16 01:26:33
486
原创 Java GC
垃圾回收器(Garbage Collection)虽然不是JVM最先使用的,但是因为工作原因,我看的都是JVM的GC。 java中不需要开发者手动释放无用对象的内存空间,gc会自动完成这一项工作,了解gc只要了解这几件事就行: 1. 哪些内存属于“垃圾”要被回收掉? 2. 什么时候执行gc来回收垃圾? 3. 怎样回收垃圾,释放内存? 一 哪些内存属于垃圾 gc是jvm自带的垃圾回收器,会自动帮助我们回收垃圾,我们要知道在jvm眼中哪些内存属于垃圾,垃圾既不在使用的内存,既然不再...
2020-07-06 02:21:39
202
原创 Java对象创建
创建一个Java只要使用new关键字就可以,但是在我们new一个对象的时候,虚拟机中经历的过程要比调用new关键字这一行代码复杂的多。 虚拟机遇到一个new指令时,先去常量池中检查这个类是否被加载解析和初始化,如果没有,则会先执行类加载过程。 当类加载检查通过后,虚拟机会为新生对象分配内存空间。新生对象所需的内存大小在类加载完成后便可完全确定,为对象分配空间的任务就是把一块确定大小的内存从java堆中划分出来。如果java堆的内存是规整的,已使用的内存放一...
2020-06-08 21:56:53
189
1
原创 JAVA内存区域(1.7及之前)
PS:最初只是简单的知道Java内存分为堆内存和栈内存,当时被告知堆内存存储的是对象,栈内存存储的是基本数据类型和指针,当时就想对象是在堆内存中,如果对象有个属性是基本数据类型,难道这个属性存在栈中吗?深入了解了一下java内存终于解了之前的疑惑。 感想:随着手机的配置越来越高,内存越来越大,CPU核心数量和频率越来越高,目前的移动端开发也有了一些改变,RN,FLUTTER等跨平台技术越来越流行,还有Kotlin,他们的共同特点是提升开发效率,封装的接口易用,可能是我对他们了解的不多,并不知道他们该如何优
2020-06-06 01:07:03
275
原创 greenDao简单使用
在项目的build.gradle中添加 compile 'de.greenrobot:greendao:2.1.0' 下载DaoGenerator项目,打开DaoGenerator项目 public static void main(String args[]) throws Exception { Schema schema = new Schema(1, "com
2016-04-05 16:00:46
2983
原创 基于ViewDragHelper的抽屉控件
现在android的抽屉控件很多,android官方也有,但是不符合我想要的样式,于是 自己写了一个。我想要的结果是滑动的时候抽屉并不动,而是首页动,android官方的 抽屉是首页不动,是将抽屉滑到首页上,qq的样式为首页滑动,漏出抽屉,但是抽屉也 是跟随着首页的滑动而滑出来的。 ViewDragHelper可以不接触ontouch而控制子view的移动,用来做抽屉也很简单很方便很强
2016-03-22 22:54:06
858
原创 Dagger2简单使用
在注入的时候需要Component,inject方法需要将被注入的对象传进来,一般都是activity,然后component就会把数据注入给传进来的对象。 例如Component是C,activity是A,A中有个对象需要被注入,对象为D,需要注入的对象要用@Inject注解,C注入对象需要Module,叫它M。M的类声明外要加@Module。 首先要初始化C,在C的
2016-03-15 15:13:42
537
原创 android 6.0权限问题
最新的android 6.0系统加入了权限控制,用户可以控制权限的开关,这样即使在manifest中申请权限了,但是用户依然可以关闭,所以在调用需要权限才能调用的api的时候,比如获取mac地址,一定要判断是否拥有权限,否则会崩溃. api23还提供了两个新的接口,checkSelfPermission()和requestPermissions(). checkSelfPermission()
2015-12-24 16:57:52
1011
原创 surfaceview缓存问题
之前在网上看到surfaceview有双缓存机制,但是实际用起来并不是绝对的双缓存,还在网上看到有说三缓存的,但是实际操作中发现这并不是绝对的. 用surfaceview绘图的时候,先调用holder.lockCanvas()获得一个canvas,然后可以在这个canvas上继续画东西,然后调用holder.unlockCanvasAndPost(canvas)将这个canvas绘制到s
2015-12-22 11:11:20
2676
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅