需求
最近公司需要在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...