android binder機制簡單使用

2021-08-20 03:39:50 字數 2983 閱讀 5650

需求

最近公司需要在native層寫乙個c++服務,用來與上層通訊,由於自己並不是很精通c++,所以決定從簡單的入手,先嘗試寫乙個binder服務。

具體實現

實現乙個binder通訊例項,需要經過以下步驟:

1、獲得servicemanager的物件引用

2、向servicemanager註冊新的service

3、在client中通過servicemanager獲得service物件引用

4、在client中傳送請求,由service返回結果。

具體**:

1、編寫myservic.h檔案

#include #include #include #include #include namespace android ;

}; //namespace

2、編寫myservice.cpp檔案
#include "myservice.h"

#include #include namespace android

myservice::myservice()

myservice::~myservice()

// 每個系統服務都繼承自bbinder類,都應重寫bbinder的ontransact虛函式。當使用者傳送請求到達service時,系統框架會呼叫service的ontransact函式,該函式分析接收到的資料報,呼叫相應的介面函式處理請求

status_t myservice::ontransact(uint32_t code, const parcel& data, parcel* reply, uint32_t flags)

break;

default:

return bbinder::ontransact(code, data, reply, flags);}}

}; //namespace

3、編寫android.mk檔案

local_path := $(call my-dir)

include $(clear_vars)

local_src_files := myservice.cpp

local_c_includes := $(jni_h_include)

local_shared_libraries := libutils libbinder

local_module_tags := optional

local_prelink_module := false

local_module := libmyservice

include $(build_shared_library)

mk檔案寫完之後進行編譯,編譯完生成libmyservice.so檔案。

4、編寫myserver.cpp檔案與相應的mk檔案

#include #include #include #include #include #include #include #include #include "../libmyservice/myservice.h"

using namespace android;

int main(int argc, char** argv)

mk檔案:

local_path:= $(call my-dir)

include $(clear_vars)

local_src_files:= \

myserver.cpp

local_c_includes := $(jni_h_include)

local_shared_libraries := \

libutils libbinder libmyservice

local_module_tags := optional

local_prelink_module := false

local_module := myserver

include $(build_executable)

編譯生成可執行檔案myserver。5、編寫myclient.h檔案

namespace android

;}; //namespace

6、編寫myclient.cpp檔案

#include #include #include "myclient.h"

namespace android

const void myclient::getmyservice()

}}; //namespace

using namespace android;

int main(int argc, char** argv)

7、編寫client端的android.mk檔案

local_path:= $(call my-dir)

include $(clear_vars)

local_src_files:= \

myclient.cpp

local_c_includes := $(jni_h_include)

local_shared_libraries := \

libutils libbinder libmyservice

local_module_tags := optional

local_prelink_module := false

local_module := myclient

include $(build_executable)

寫完之後編譯生成myclient可執行檔案。

乙個binder的服務端與客戶端的例子就寫好了,生成的so檔案push到system/lib/下面,兩個可執行檔案push到system/bin/目錄下。

android binder機制詳解

1.直觀來說,binder是android中的乙個類,它繼承了ibinder介面 2.從ipc角度來說,binder是android中的一種跨程序通訊方式,binder還可以理解為一種虛擬的物理裝置,它的裝置驅動是 dev binder,該通訊方式在linux中沒有 3.從android frame...

Android binder 機制簡單分析

android 系統使用驅動的方式實現binder,用來跨程序通訊。1.android binder驅動中分配了一塊記憶體,將其對映到核心空間和使用者空間,減少資料拷貝次數。2.設計了binder通訊協議。3.在servicemanager中註冊。4.並且簡化了binder通訊 開發流程,開發者使用...

Android Binder機制原始碼筆記 2

乙個client要獲得想要通訊的service的handle,必須先借助於servicemanager來獲得想要的service的handle,所以第一步是和servicemanager這個service通訊,而servicemanader其handle固定為0,因此在iservicemanager...