C++ binder 實現
Binder機制的實現集合了 Android系統四大元件Client,Server,Service Manager和Binder的驅動程式。
在應用層面,Client和Server直接通過Binder進行資料互動,Client對Server中的服務發出請求, Server開啟Binder寫入資料,Client通過Binder讀取資料。Client和Server程式這間的資料通訊通過Binder驅動程式間接實現,Client和Server通過open廣法和ioctl檔案操作方法與Binder驅動程式進行通訊。
Binder驅動程式為應用層的程式間通訊提供底層支援,它是一個misc型別裝置,提供裝置檔案/dev/binder與使用者空間互動,其中驅動的程式碼位置如下:
kernel/drivers/staging/android/binder.h
kernel/drivers/staging/android/binder.c
應用層程式之間通訊的服務由Service Manager負責,它是一個守護程式,對Android系統中所有的Service進行管理,每個Server所提供的服務需要向Service Manager註冊,以供Client進行查詢和獲取。
1 定義一個繼承於BBinder類的TopsciService類,在TopsciService類中定義了初始化insantiate函式,建構函式,解構函式以及Client與Server互動的onTransact函式
class TopsciService : public BBinder
{
mutable Mutex mLock;
int32_t mNextConnId;
public:
//初始化,例項化Topsciservice
static int instantiate();
//TopsciService建構函式
TopsciService();
//TopsciService解構函式
virtual ~TopsciService();
//開啟Binder裝置
virtual status_t onTransact( uint32_t, const Parcel&, Parcel*, uint32_t);
}
2 TopsciService類的具體實現
TopsciService成員函式instantiate實現了對TopsciService類初始化功能,即呼叫addService函式把TopsciService作為一項服務新增到ServiceManager中,完成向ServiceManager的註冊工作。
static int TopsciService::instantiate()
{
int r = defaultServiceManager()->addService(String16("guilh.add"),new TopsciService());
return r;
}
TopsciService的onTransact函式實現了Client與TopsciService Server之間的具體通訊,當Client準備向TopsciService傳送訊息時,首先建立一個Handler為0的代理物件Binder,然後Client傳送請求給這個代理物件,該代理物件通過驅動把資訊傳遞給Server,TopsciService服務讀取到Client發給它的資料後,將此資料加1000送返回給Client.
TopsciService::onTransact(uint32_t code, const Parcel& data,Parcel* reply,unit32_t flags)
{
switch(code)
{
case 0:
{
pid_t pid = data.readInt32();
int num = data.readInt32(); //讀取Client傳送的資料
num = num+1000;
reply->writeInt32(num);//把加1000後的資料傳送回客戶端
return NO_ERROR;
}
break;
default:
//如果client建立的handler不為0,則呼叫BBinder類onTransact
return BBInder::onTransact(code,data,reply,flags);
}
}
TopsciService應用程式主入口
int main(int argc,char** argv)
{
//獲得一個ProcessState例項
sp<ProcessState> proc(ProcessState::self());
//獲取ServiceManager
sp<IServiceManager> sm = defaultServiceManager();
//把自己作為服務新增到ServiceManager
TopsciService::instantiate();
//啟動緩衝 池
ProcessState::self()->startThreadPool();
//把服務新增到Binder閉合迴圈程式中
IPCThreadState::self()->joinThreadPool();
return 0;
}
Client端
class TopsciClient :public BBinder
{
int main()
{
sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> b = sm->getService(String16("guilh.add"));
if (b == NULL)
{
return -1;
}
Parcel in1 ,out1;
TopsciClient* cb = new TopsciClient();
in1.wirteInt32((int)getpid());
in1.writeInt32(0);
int ret = b->transact(0,in1,&out1,0);
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
return 0;
}
}
相關文章
- Android Binder實現示例(C/C++層)AndroidC++
- c++ binderC++
- Binder Java層的實現原理分析Java
- 理解 Android Binder 機制(二):C++層AndroidC++
- Android C++層使用Binder通訊的方法AndroidC++
- [Hook] 跨程式 Binder設計與實現 - 設計篇Hook
- [C++]實現memcpyC++memcpy
- Binder
- c++實現Json庫C++JSON
- 堆排序(實現c++)排序C++
- 命令模式(c++實現)模式C++
- LinkBlockedQueue的c++實現BloCC++
- 堆排序c++實現排序C++
- Binder總結篇1-Binder原理
- Binder總結篇2-Binder使用
- Spring Cloud Stream應用與自定義RocketMQ Binder:實現RocketMQ繫結器SpringCloudMQ
- 單例模式c++實現單例模式C++
- FastASR——PaddleSpeech的C++實現ASTC++
- 享元模式(c++實現)模式C++
- 狀態模式(c++實現)模式C++
- 中介者模式(c++實現)模式C++
- 模板方法模式(c++實現)模式C++
- C++程式設計實現C++程式設計
- 橋接模式(c++實現)橋接模式C++
- 折半查詢(C++實現)C++
- 字典樹及其C++實現C++
- c++ web框架實現之靜態反射實現C++Web框架反射
- Android Binder之旅Android
- Binder機制
- 原型模式的C++實現原型模式C++
- C++實現Prim演算法C++演算法
- 迴圈佇列C++實現佇列C++
- HTTPS通訊的C++實現HTTPC++
- C++ 實現Golang裡的deferC++Golang
- C++庫封裝JNI介面——實現java呼叫c++C++封裝Java
- C++筆記——C++基本思想與實現(一)C++筆記
- [C++ & AdaBoost] 傻陳帶你用C++實現AdaBoostC++
- 用c++實現淨現值的計算C++
- QT:用QWebSocket實現webchannel,實現C++與HTML通訊QTWebC++HTML