打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Binder机制,从Java到C (7. Native Service)

1.什么是NativeService

Native Service,是通过C或C++代码写出來,提供给Java进行远程调用的RemoteService。向Android开机就启动的surfaceflinger,media都是native service。

在前一篇中,我們总结了Binder通信的整個流程:
Java Proxy代码走到JNI实现的BinderProxy的transact()方法之后,就直接进入到Native实现的BpBinder,然后一直通过IPCThreadState对象发送Binder消息。
而在另一个process的IPCThreadState会接收Binder消息,再通过JNI回调Java里的Stub的onTransact()方法。

 

 

2.BnXXX 和  BpXXX

如果需要通过Native代码來提供服务:
从IBinder接口的Stub对象的原理可以看出,如果在回调Java的JNI之前将代码调用截断,直接通过Native代码來实现onTransact()方法,就可以完成Service的Stub端的实现。
同時,RemoteService应该不仅提供给Java,也可以提供给Native,所以也应该提供Native的Proxy端,就是直接通过BpBinder的transact()方法來发送Binder消息。


下面图中的 BnXXX和BpXXX对应着Java环境里的的Stub和Proxy

 

 

 

3. 怎樣寫Native Service?
如果要手动实现各个类,会造成代码的大量重复,并且出错的几率会大大增加。

和Java环境里的aidl工具类似。Native也会使用重用技术。它的重用是通过template 体现的。

一些模板类都在IInterface中。

/frameworks/native/include/binder/IInterface.h

 1 class IInterface : public virtual RefBase 2 { 3 public: 4             IInterface(); 5             sp<IBinder>         asBinder(); 6             sp<const IBinder>   asBinder() const; 7  8 protected: 9     virtual                     ~IInterface();10     virtual IBinder*            onAsBinder() = 0;11 };12 13 template<typename INTERFACE>14 class BnInterface : public INTERFACE, public BBinder//实现Stub功能的模板,扩展BBinder的onTransact()方法实现Binder命令的解析和执行。15 {16 public:17     virtual sp<IInterface>      queryLocalInterface(const String16& _descriptor);18     virtual const String16&     getInterfaceDescriptor() const;19 20 protected:21     virtual IBinder*            onAsBinder();22 };23 24 template<typename INTERFACE>25 class BpInterface : public INTERFACE, public BpRefBase//实现Proxy功能的模板,BpRefBase里有个mRemote对象指向一个BpBinder对象。26 {27 public:28                                 BpInterface(const sp<IBinder>& remote);29 30 protected:31     virtual IBinder*            onAsBinder();32 };

 

来看一下类结构:

 

 

有了template,编写一个Native Service的工作量也不大。比如如果将第一篇中的Application RemoteService 转化成Native Service:
1.实现一个接口文件,IXXXService,继承IInterface
2.定义BnXXX,继承BnInterface<IXXXService>。实现一个XXXService,继承BnXXX,并实现onTransact()函数。
3.定义BpXXX,继承BpInterface<IXXXService>。

 

如果实现了native的RemoteService,会是下面的结构。红框框就是我们要写的。

 

 

Native Service只要稍微了解一下,看得懂代码流程就好了,毕竟应该没什么机会去写native service吧。

 

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Android-IPC-Binder(1)
Android 12 系统源码分析 | Native Binder 代码变迁
三步掌握 Android 中的 AIDL
Android实战技术:深入理解Android的RPC方式与AIDL
Android 内核--Binder架构分析
aidl编写格式
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服