前面说过,这里传进来的参数是一个BpBinder的指针,而BpBinder::checkSubclass继承于父类IBinder::checkSubclass,它什么也不做就返回false。
于是函数继续往下执行:
jobject object = (jobject)val->findObject(&gBinderProxyOffsets);
由于这个BpBinder对象是第一创建,它里面什么对象也没有,因此,这里返回的object为NULL。于是函数又继续往下执行:
object = env->NewObject(gBinderProxyOffsets.mClass, gBinderProxyOffsets.mConstructor);
这里,就创建了一个BinderProxy对象了。创建了之后,要把这个BpBinder对象和这个BinderProxy对象关联起来:env->SetIntField(object, gBinderProxyOffsets.mObject, (int)val.get());
就是通过BinderProxy.mObject成员变量来关联的了,BinderProxy.mObject成员变量记录了这个BpBinder对象的地址。接下去,还要把它放到BpBinder里面去,下次就要使用时,就可以在上一步调用BpBinder::findObj把它找回来了:
val->attachObject(&gBinderProxyOffsets, refObject, jnienv_to_javavm(env), proxy_cleanup);
最后,就把这个BinderProxy返回到Android_os_BinderInternal_getContextObject函数,最终返回到最开始的ServiceManager.getIServiceManager函数中来了,于是,我们就获得一个BinderProxy对象了。回到ServiceManager.getIServiceManager中,从下面语句返回:
sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject());
相当于是:
sServiceManager = ServiceManagerNative.asInterface(new BinderProxy());
接下去就是调用ServiceManagerNative.asInterface函数了,这个函数定义在frameworks/base/core/java/android/os/ServiceManagerNative.java文件中:
public abstract class ServiceManagerNative ...... { ...... static public IServiceManager asInterface(IBinder obj) { if (obj == null) { return null; } IServiceManager in = (IServiceManager)obj.queryLocalInterface(descriptor); if (in != null) { return in; } return new ServiceManagerProxy(obj); } ...... }
这里的参数obj是一个BinderProxy对象,它的queryLocalInterface函数返回null。因此,最终以这个BinderProxy对象为参数创建一个ServiceManagerProxy对象。返回到ServiceManager.getIServiceManager中,从下面语句返回:
sServiceManager = ServiceManagerNative.asInterface(new BinderProxy());
就相当于是:
sServiceManager = new ServiceManagerProxy(new BinderProxy());
于是,我们的目标终于完成了。总结一下,就是在Java层,我们拥有了一个Service Manager远程接口ServiceManagerProxy,而这个ServiceManagerProxy对象在JNI层有一个句柄值为0的BpBinder对象与之通过gBinderProxyOffsets关联起来。
这样获取Service Manager的Java远程接口的过程就完成了。