java c 服务_Binder机制,从Java到C (7. Native Service)

本文介绍了Android的Native Service,即使用C或C++编写的远程服务,它能被Java调用。文章通过分析Binder通信流程,展示了如何在Native层面实现Service的Stub和Proxy,利用模板类BnInterface和BpInterface简化开发工作。尽管通常不常编写Native Service,理解其工作原理对于Android系统开发者仍很重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()方法。

d01804c6fc08c9fe3a5931c1b639c887.png

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

ba74a7522a2b53f156d8506921a803ef.png

3. 怎樣寫Native Service?

如果要手动实现各个类,会造成代码的大量重复,并且出错的几率会大大增加。

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

一些模板类都在IInterface中。

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

1 class IInterface : public virtualRefBase2 {3 public:4 IInterface();5 spasBinder();6 sp asBinder() const;7

8 protected:9 virtual ~IInterface();10 virtual IBinder* onAsBinder() = 0;11 };12

13 template

14 class BnInterface : public INTERFACE, public BBinder//实现Stub功能的模板,扩展BBinder的onTransact()方法实现Binder命令的解析和执行。

15 {16 public:17 virtual sp queryLocalInterface(const String16&_descriptor);18 virtual const String16& getInterfaceDescriptor() const;19

20 protected:21 virtual IBinder*onAsBinder();22 };23

24 template

25 class BpInterface : public INTERFACE, public BpRefBase//实现Proxy功能的模板,BpRefBase里有个mRemote对象指向一个BpBinder对象。

26 {27 public:28 BpInterface(const sp&remote);29

30 protected:31 virtual IBinder*onAsBinder();32 };

来看一下类结构:

238bea40d9994672e83f40efc8190cf9.png

有了template,编写一个Native Service的工作量也不大。比如如果将第一篇中的Application RemoteService 转化成Native Service:

1.实现一个接口文件,IXXXService,继承IInterface

2.定义BnXXX,继承BnInterface。实现一个XXXService,继承BnXXX,并实现onTransact()函数。

3.定义BpXXX,继承BpInterface。

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

f8e2e191e918d69fb2ad698c84e4bc31.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值