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