首页 > 编程知识 正文

安卓开发和java开发(buildroot教程)

时间:2023-05-04 12:59:19 阅读:68582 作者:42

IBinder和BpBinder

引言

总结以往的学习内容,对于ServiceManager,如果想使用服务,首先导入ServiceManagerProxy,到上层则为ServiceManager.java和servicemanagernative

创建ServiceManagerProxy时,我们传递了IBinder对象,并使用其transact方法与Binder驱动程序进行了通信。

其次,分析IBinder的实现原理

IBinder

IBinder接口必须有与Binder一致的接口方法,即实现命令的方法

publicbooleantransact(intcode、Parcel data、Parcel reply、int flags )。

throws远程执行;

要检索IBinder对象,需要一个新类来检索名为BinderInternal的对象。 获取方法如下。

publicstaticfinalnativeibindergetcontextobject (;

很明显,这里也会继续调用朴素方法。 因为最终需要与Binder驱动程序相关联。

(staticjobjectandroid _ OS _ binder internal _ getcontextobject (JNI env * env,jobject clazz ) ) ) ) ) ) ) )

{

SPB=处理状态:3360 self (-getcontextobject (null ) );

returnjavaobjectforibinder(env,b );

}

可以看到,它利用了调用getContextObject方法并最终返回BpBinder对象的ProcessState

Bp绑定器

IBinder只是接口类,在朴素层由BpBInder继承,在java层由Binder.java中的BinderProxy实现。

执行命令时,必须用JNI转换命令。 首先,它从Java层Binder中的BinderProxy开始,用于JNI。

Ibinder*target=(Ibinder* ) env-getlongfield(obj,gBinderProxyOffsets.mObject );

使用getLongField获取BpBinder的内存地址,并继续调用BpBinder的处理请求函数。

satus _ TBP binder :3360 transact (

uint 32 _ t代码,const Parcel data,Parcel* reply,uint32_t flags )

{

//Once a binder has died,it will never come back to life。

if(malive ) {

status _ tstatus=ipcthreadstate :3360 self (-transact (

mHandle、code、data、reply和flags;

if(status==dead_object ) mAlive=0;

返回状态;

}

return DEAD_OBJECT;

}

可以看出,在该函数中仍然使用IPCThreadState进行Binder驱动的通信。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。