
bind涉及的文件------------------------------------------------------------------------------------------>
1、JAVA层相关:-------------------------- ---ServiceManager.java public final class ServiceManager{ private static IServiceManager sServiceManager;//定义一个IServiceManager静态类对象成员,保存ServiceManager的代理ServiceManagerProxy。 它通过函数getIServiceManager来获取初值。 getIServiceManager()函数很重要,它定义和生成了JAVA层ServiceManager的代理ServiceManagerProxy和Binder的代理BinderProxy(通过调用JNI函数getContextObject在JNI层获取的)。定义如下: private static IServiceManager getIServiceManager() { if (sServiceManager != null) { return sServiceManager; } // Find the service manager sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject()); // this statement is equal //sServiceManager = ServiceManagerNative.asInterface(new BinderProxy()); //sServiceManager = new ServiceManagerProxy(new BinderProxy()); //end return sServiceManager; } ***首先通过BinderInternal的getContextObject方法得到一个BinderProxy对象。getContextObject是一个JNI调用,在JNI(android_util_Binder.cpp)中实现new一个BinderProxy返回。 ***其次通过ServiceManagerNative的方法asInterface得到(new)一个ServiceManagerProxy对象。并将BinderProxy对象保存到类成员mRemote中。 ***此函数使我们在Java层,拥有了一个Service Manager远程接口ServiceManagerProxy,而这个ServiceManagerProxy对象在JNI层有一个句柄值为0的BpBinder对象与之通过gBinderProxyOffsets(或者说BinderProxy.mObject保存有BpBinder对象的地址)关联起来。 } getIServiceManager函数用到了ServiceManagerNative和BinderInternal类。 ---IServiceManager.java public interface IServiceManager extends IInterface{}继承自IInterface接口,本身还是接口。 此文件定义一个接口,其中声明了和C++相似的交互接口,以及各类操作的消息。 ---ServiceManagerNative.java public abstract class ServiceManagerNative extends Binder implements {} 定义了类ServiceManagerNative(本地) ServiceManagerNative继承自Binder,并实现IServiceManager的接口。它的asInterface()提供一个ServiceManagerProxy对象。 class ServiceManagerProxy implements IServiceManager {} 定义了类ServiceManagerProxy(代理) ServiceManagerProxy继承自IServiceManager,并实现了其声明的操作函数,只会被ServiceManagerNative创建, 它实现了IServiceManager的接口,IServiceManager提供了getService和addService两个成员函数来管理系统中的Service。 ---BinderInternal.java public class BinderInternal{}此类主要用来提供一些测试用的接口,都是JNI调用。 同时方法getContextObject通过JNI得到BinderProxy对象,用来给JAVA层提供调用。 JNI层的函数对应如下: static jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject clazz) { sp return javaObjectForIBinder(env, b); } sp 相当于 sp 接着调用javaObjectForIBinder把这个BpBinder对象转换成一个BinderProxy对象 注意: gBinderOffsets变量是用来记录JAVA层Binder类的相关信息的,它是在注册Binder类的JNI方法的int_register_android_os_Binder函数初始化的; gBinderProxyOffsets是用来变量是用来记录JAVA层BinderProxy类的相关信息的,它是在注册BinderProxy类的JNI方法的int_register_android_os_BinderProxy函数初始化的。 在函数javaObjectForIBinder中创建了一个BinderProxy对象: object = env->NewObject(gBinderProxyOffsets.mClass, gBinderProxyOffsets.mConstructor); C++层的BpBinder对象和JAVA层的BinderProxy对象关联,是通过函数javaObjectForIBinder中的如下语句, env->SetIntField(object, gBinderProxyOffsets.mObject, (int)val.get()); 建立的,BinderProxy.mObject成员变量记录了这个BpBinder对象的地址。 同时使用, val->attachObject(&gBinderProxyOffsets, refObject, jnienv_to_javavm(env), proxy_cleanup); 把BinderProxy的地址放到BpBinder里面去,以后通过调用BpBinder::findObj可以找到。 ---Binder.java public class Binder implements IBinder{} final class BinderProxy implements IBinder{} 此文件定义Binder和BinderProxy类 Binder实现的IBinder的接口,他的大部分函数都是通过JNI调用底层实现的。 BinderProxy是JAVA层的关键类,在JNI通过gBinderProxyOffsets来使用。 ---IInterface.java public interface IInterface{} 此文件只定义JAVA的接口IInterface,其内生命了asBinder函数,返回值为IBinder对象。 ---IBinder.java public interface IBinder {} 此文件只定义了接口IBinder。此接口声明了接口紧密相关的几个方法。 ---Parcel.java public final class Parcel {} Parcel类是用Java来实现的,它跟用C++实现的Parcel类的作用是一样的,即用来在两个进程之间传递数据。 2、C++层相关:------------------------------ BpBinder.cpp BpBinder.h sp 相当于, sp 3、JNI相关文件:------------------------ android_util_Binder.cpp class JavaBBinder : public BBinder JavaBBinder继承自C++的BBinder类 int_register_android_os_Binder()注册Binder类的JNI方法 static const JNINativeMethod gBinderMethods[] JAVA和C++层函数映射表 register_android_os_Binder此函数用来注册所有类型的JNI class JavaBBinderHolder : public RefBase{} 此类是实现JNI的关键类对象。 我们就是要把JavaBBinderHolder里面的JavaBBinder类型Binder实体添加到Service Manager中去,以便使得这个HelloService有Client来请求服务时,由Binder驱动程序来唤醒这个Server线程,进而调用这个JavaBBinder类型Binder实体的onTransact函数来进一步处理,这个函数我们在后面会继续介绍。 class JavaBBinder : public BBinder{} android_util_Binder.h 函数, android_os_BinderInternal_getContextObject gBinderInternalMethods表 Jni.h JNIHelp.c jniRegisterNativeMethods注册JNI函数
