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;
}
}
相關文章
- c++閹割版binder實現C++
- Binder系統_c++程式實現C++
- Android Binder實現示例(C/C++層)AndroidC++
- c++ 層實現binder服務樣例C++
- c++ binderC++
- binder 一個簡單的c++服務的實現,與callback實現C++
- binder c++ 類C++
- Binder Java層的實現原理分析Java
- Binder機制分析(2)——從MediaService中看Binder的實現和使用(1)
- Binder機制分析(2)——從MediaService中看Binder的實現和使用(2)
- Binder機制分析(3)—— 實現自己的Service
- Android Binder設計與實現 - 設計篇Android
- 理解 Android Binder 機制(二):C++層AndroidC++
- android binder c++層-客戶端(c++) 呼叫 服務端(c++) 例子AndroidC++客戶端服務端
- [Hook] 跨程式 Binder設計與實現 - 設計篇Hook
- Binder學習(四)利用AIDL、Messenger實現IPCAIMessenger
- Android C++層使用Binder通訊的方法AndroidC++
- [C++]實現memcpyC++memcpy
- binder通訊例項之c++客戶端與c++服務端C++客戶端服務端
- Android通過繼承Binder類實現多程式通訊Android繼承
- 命令模式(c++實現)模式C++
- 堆排序(實現c++)排序C++
- 堆排序c++實現排序C++
- Binder總結篇2-Binder使用
- Binder總結篇1-Binder原理
- Binder學習(二)Binder機制解析
- 享元模式(c++實現)模式C++
- 中介者模式(c++實現)模式C++
- 橋接模式(c++實現)橋接模式C++
- 模板方法模式(c++實現)模式C++
- 狀態模式(c++實現)模式C++
- 字典樹及其C++實現C++
- 折半查詢(C++實現)C++
- C++程式設計實現C++程式設計
- LinkBlockedQueue的c++實現BloCC++
- hanoi漢諾塔C++實現C++
- C++實現蛇形矩陣C++矩陣
- C++實現單例模式C++單例模式