ibinderForJavaObject

sp<IBinder> ibinderForJavaObject(JNIEnv* env, jobject obj) {
    if (obj == NULL) return NULL;
    // Java层的Binder对象
    if (env->IsInstanceOf(obj, gBinderOffsets.mClass)) {
        JavaBBinderHolder* jbh = (JavaBBinderHolder*)
            env->GetIntField(obj, gBinderOffsets.mObject);
        return jbh != NULL ? jbh->get(env, obj) : NULL;
    }
    // Java层的BinderProxy对象
    if (env->IsInstanceOf(obj, gBinderProxyOffsets.mClass)) {
        return (IBinder*)
            env->GetIntField(obj, gBinderProxyOffsets.mObject);
    }
    return NULL;
}

如果Service和请求方在同一进程中,创建JavaBBinderHolder对象,并把JavaBBinderHolder对象地址保存到Binder.mObject成员变量。请查看JavaBBinderHolder.get()详情,其返回JavaBBinder对象,即在同进程中以JavaBBinder形式进行数据传递。

如果Service和请求方不在同一进程中,那么将进入第二个if分支,此时将返回一个BpBinder对象。

results matching ""

    No results matching ""