Mstar理论及实践篇(5)

2020-04-03 12:16

4. 编写跟头文件同名的本地方法; 5. 生成动态库,如*.so文件; 6. 运行程序。

举例:万能接口实现的例子 1. 声明native本地方法

@ics\\frameworks\\base\\tv\\java\\com\\tvos\\common\\TvManager.java

2. 加载so库

3. 编译后的tvos_tvmanager_jni.so在/android/ics/frameworks/base/tv/jni,整

个JNI调用过程完成。

再举一个Android的拼音输入法服务进程的例子: 1. 声明native本地方法

@ics/packages/inputmethods/pinyinime/src/com/android/inputmethod/pinyin/pinyinDecoderService.java

2. 加载*.so库

3. So库的实现代码

@ics/packages/inputmethods/pinyinime/jni/android/com_android_inputmethod_pinyin_PinyinDecoderService.cpp

Binder

在Android系统中,是以进程为单位分配和管理资源的。处于保护机制,一个进程不能直接访问另一个进程的资源,但为了多个进程完成同一任务,要求进程间能够互相通信。Android同时为Java环境和C/C++环境提供了Binder机制。Binder通信是基于server与client的,Binder通信是同步而不是异步的。 Binder机制的组成:

1. service manager:管理Android系统中的所有服务; 2. server:Binder的服务器端; 3. client:Binder的客户端;

4. 服务代理:服务代理指在客户端生成的服务端代理(proxy)。服务代理具有Server

的功能,这样客户端可以通过服务代理去访问服务端的方法。

Binder的工作流程:

1. 客户端首先获得服务器端的代理对象;

2. 客户端通过调用服务器代理对象的方式向服务器端发送请求; 3. 代理对象将用户请求通过Binder驱动发送到服务器进程;

4. 服务器进程处理用户请求,并通过Binder驱动返回处理结果给客户端的服务器代

理对象;

5. 客户端收到服务器端的返回结果。

Binder的几个缩写: p是proxy即代理的意思,Bp就是BinderProxy

Bn 是Binder Native的含义,是和Bp相对的,Bp的p是proxy代理的意思,那么另一端一定有一个和代理打交道的东西,这个就是Bn

下来结合代码看看Binder的实现,为了实现进程间的双向通信,Service跟Client的角色可以灵活变化,这就产生了两种情况:

1. Supernova(Service)<->Framework(Client): App通过调用Framework提供的接口,

然后Framework通过Binder通信,向Supernova请求服务。

a. Supernova提供的服务即Binder的服务器端,服务器端要实现BnXXX。以便

和客户端的BpXXX,即客户端的代理对象打交道,首先说说Supernova提供哪些服务?Supernova的服务源代码定义在Supernova/projects/tvos,命名规则为XXXservice,这些服务对应的BnXXX定义在Supernova/projects/tvos/main/main.cpp,如下:

这些BnXXX对象的初始化在void * AndroidServiceInitThread(void * pData)函数,BnXXX中主要是定义并实现了onTransact()函数,其作用就是,当在客户端的代理对象调用了transact函数后,这边的onTransact()函数就会被调用。 然后要向Service Manager注册服务,注册服务在每个BnXXX对象的instantiate()方法实现,如下:

服务的具体实现在Msrv_XXX.cpp里。

BnXXX的实现,先定义一个继承IInterface的类ITimerManager,再由BnTimerManager继承ITimerManager类,而TimerManagerService::Client又继承于BnTimerManager,所以ITimerManager定义的虚函数都在TimerManagerService::Client实现。 至此,服务器端的Binder已建立好了。

b. 客户端的Binder实现。

首先通过AIDL定义接口,如ITvServiceServerTimer,生成ITvServiceServerTimer.Stub类,再在TimerBinder实现方法。

举例说明具体实现过程,如菜单调节sleep time为例: ? App调用AIDL提供的接口:

Tvapp/tv2d_ui/src/mstar/tvsetting/ui/TimeViewHolder.java

AIDL的实现在

framework/base/policy/src/com/mstar/tv/service/TimerBinder.java

TimerManager.java

Supernova作为服务器端的接收: ITimerManager.cpp


Mstar理论及实践篇(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:[解析版]全国普通高等学校2017届高考数学二模试卷(文科)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: