中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Binder機制,從Java到C (7. Native Service)

1.什么是NativeService

Native Service,是通過C或C++代碼寫出來,提供給Java進行遠(yuǎn)程調(diào)用的RemoteService。向Android開機就啟動的surfaceflinger,media都是native service。

在前一篇中,我們總結(jié)了Binder通信的整個流程:
Java Proxy代碼走到JNI實現(xiàn)的BinderProxy的transact()方法之后,就直接進入到Native實現(xiàn)的BpBinder,然后一直通過IPCThreadState對象發(fā)送Binder消息。
而在另一個process的IPCThreadState會接收Binder消息,再通過JNI回調(diào)Java里的Stub的onTransact()方法。

 

 

2.BnXXX 和  BpXXX

如果需要通過Native代碼來提供服務(wù):
從IBinder接口的Stub對象的原理可以看出,如果在回調(diào)Java的JNI之前將代碼調(diào)用截斷,直接通過Native代碼來實現(xiàn)onTransact()方法,就可以完成Service的Stub端的實現(xiàn)。
同時,RemoteService應(yīng)該不僅提供給Java,也可以提供給Native,所以也應(yīng)該提供Native的Proxy端,就是直接通過BpBinder的transact()方法來發(fā)送Binder消息。


下面圖中的 BnXXX和BpXXX對應(yīng)著Java環(huán)境里的的Stub和Proxy

 

 

 

3. 怎樣寫Native Service?
如果要手動實現(xiàn)各個類,會造成代碼的大量重復(fù),并且出錯的幾率會大大增加。

和Java環(huán)境里的aidl工具類似。Native也會使用重用技術(shù)。它的重用是通過template 體現(xiàn)的。

一些模板類都在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//實現(xiàn)Stub功能的模板,擴展BBinder的onTransact()方法實現(xiàn)Binder命令的解析和執(zhí)行。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//實現(xiàn)Proxy功能的模板,BpRefBase里有個mRemote對象指向一個BpBinder對象。26 {27 public:28                                 BpInterface(const sp<IBinder>& remote);29 30 protected:31     virtual IBinder*            onAsBinder();32 };

 

來看一下類結(jié)構(gòu):

 

 

有了template,編寫一個Native Service的工作量也不大。比如如果將第一篇中的Application RemoteService 轉(zhuǎn)化成Native Service:
1.實現(xiàn)一個接口文件,IXXXService,繼承IInterface
2.定義BnXXX,繼承BnInterface<IXXXService>。實現(xiàn)一個XXXService,繼承BnXXX,并實現(xiàn)onTransact()函數(shù)。
3.定義BpXXX,繼承BpInterface<IXXXService>。

 

如果實現(xiàn)了native的RemoteService,會是下面的結(jié)構(gòu)。紅框框就是我們要寫的。

 

 

Native Service只要稍微了解一下,看得懂代碼流程就好了,畢竟應(yīng)該沒什么機會去寫native service吧。

 

 

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android-IPC-Binder(1)
Android 12 系統(tǒng)源碼分析 | Native Binder 代碼變遷
三步掌握 Android 中的 AIDL
Android實戰(zhàn)技術(shù):深入理解Android的RPC方式與AIDL
Android 內(nèi)核--Binder架構(gòu)分析
aidl編寫格式
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服