Android.mk
- include $(call all-subdir-makefiles)
一、接口类
mkdir interface //创建interface目录,存放接口类
Itestbinder.h
- #include <binder/IInterface.h>
- namespace android{
- class Itestbinder : public IInterface{
- public:
- DECLARE_META_INTERFACE(testbinder);
- virtual int testinterface(int a) = 0;
- };
-
- class Bntestbinder : public BnInterface<Itestbinder>{
- public:
- virtual status_t onTransact( uint32_t code,
- const Parcel& data,
- Parcel* reply,
- uint32_t flags = 0);
- };
- }
Itestbinder.cpp
- #include "Itestbinder.h"
- #include <binder/Parcel.h>
- #include <binder/IInterface.h>
- namespace android{
- enum {
- TEST_INTERFACE,
- };
-
- class Bptestbinder : public BpInterface<Itestbinder>{
- public:
- Bptestbinder(const sp<IBinder>& impl) : BpInterface<Itestbinder>(impl){
- }
- virtual int testinterface(int a){
- LOGD("TK---->>>>>>Itestbinder.cpp>>>>Bptestbinder::testinterface\n");
- Parcel data,reply;
- data.writeInt32(a);
- remote()->transact(TEST_INTERFACE,data,&reply);
- return reply.readInt32();
- }
- };
-
- IMPLEMENT_META_INTERFACE(testbinder, "android.test.Itestbinder");
-
- status_t Bntestbinder::onTransact(
- uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){
- LOGD("TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact\n");
- switch (code) {
- case TEST_INTERFACE:{
-
- LOGD("TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact>>111\n");
- reply->writeInt32(testinterface((int) data.readInt32()) );
- return NO_ERROR;
- } break;
- default:{
- LOGD("TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact>>222\n");
- return BBinder::onTransact(code, data, reply, flags);
- }
- }
- }
- }
二、客户端实现
mkdir client //创建client目录,这个是client的实现
client.h
- #include "../interface/Itestbinder.h"
-
- namespace android{
- class client{
- public:
- static const sp<Itestbinder>& get_test_binder();
- static sp<Itestbinder> gtestbinder;
- };
- }
client.cpp
- #include "client.h"
- #include <binder/IServiceManager.h>
- #include <utils/Log.h>
- #include <stdio.h>
- namespace android{
- sp<Itestbinder> client::gtestbinder;
- const sp<Itestbinder>& client::get_test_binder(){
- if (gtestbinder == 0) {
- sp<IServiceManager> sm = defaultServiceManager();
- sp<IBinder> binder;
- do {
- binder = sm->getService(String16("test.Itestbinder"));
- if (binder != 0)
- break;
- printf("testbinder not published, waiting...");
- usleep(500000);
- } while (true);
- gtestbinder = interface_cast<Itestbinder>(binder);
- }
- if(gtestbinder==0) printf("no testbinder!?");
- return gtestbinder;
- }
- }
main.cpp
- #include <stdio.h>
- #include "client.h"
-
- using namespace android;
-
- int main(int argc, char* argv[]){
- client* myclient = new client();
- if(myclient == NULL) return 0;
- const sp<Itestbinder>& tb = myclient->get_test_binder();
- if(tb == NULL) return 0;
- int a = tb->testinterface(3);
- LOGD("TK-------->>>result is %d\n",a);
- delete myclient;
- return 0;
- }
Android.mk
- LOCAL_PATH:= $(call my-dir)
- #LOCAL_CFLAGS_ALL :=-I. -I$(LOCAL_PATH)/..
-
- include $(CLEAR_VARS)
-
- LOCAL_SRC_FILES:= \
- client.cpp \
- main.cpp \
- ../interface/Itestbinder.cpp
-
- LOCAL_SHARED_LIBRARIES := \
- libui libcutils libutils libbinder libsonivox libicuuc libexpat \
- libdl
-
-
- LOCAL_MODULE:= client
- LOCAL_MODULE_TAGS := optional
-
- include $(BUILD_EXECUTABLE)
三、服务端
mkdir server //创建server目录,这个是服务端实现
testbinder.h
- #include "../interface/Itestbinder.h"
- #include <binder/BinderService.h>
- namespace android{
- class testbinder:
- public BinderService<testbinder>,
- public Bntestbinder{
- friend class BinderService<testbinder>;
- public:
- static const char* getServiceName() { return "test.Itestbinder"; }
- virtual int testinterface(int a);
- virtual status_t onTransact(
- uint32_t code,
- const Parcel& data,
- Parcel* reply,
- uint32_t flags);
-
- };
- }
testbinder.cpp
- #include <binder/IPCThreadState.h>
- #include <binder/IServiceManager.h>
- #include <utils/Log.h>
-
- #include <binder/Parcel.h>
- #include <binder/IPCThreadState.h>
- #include <utils/String16.h>
- #include <utils/threads.h>
- #include <utils/Atomic.h>
-
-
- #include <cutils/properties.h>
- #include <cutils/compiler.h>
- #include "testbinder.h"
-
- namespace android{
- int testbinder::testinterface(int a){
- LOGD("TK---->>>>>>testbinder.cpp>>>>testbinder::testinterface\n");
- return a+2;
- }
- status_t testbinder::onTransact(
- uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){
- LOGD("TK---->>>>>>testbinder.cpp>>>>testbinder::onTransact\n");
- return Bntestbinder::onTransact(code, data, reply, flags);
- }
- }
main.cpp
- #include <binder/IPCThreadState.h>
- #include <binder/ProcessState.h>
- #include <binder/IServiceManager.h>
- #include <utils/Log.h>
-
- #include "testbinder.h"
-
-
- using namespace android;
-
- int main(int argc, char** argv)
- {
- sp<ProcessState> proc(ProcessState::self());
- sp<IServiceManager> sm = defaultServiceManager();
- LOGI("ServiceManager: %p", sm.get());
- testbinder::instantiate();
- ProcessState::self()->startThreadPool();
- IPCThreadState::self()->joinThreadPool();
- return 0;
- }
Android.mk
- LOCAL_PATH:= $(call my-dir)
- #LOCAL_CFLAGS_ALL :=-I. -I$(LOCAL_PATH)/..
-
- include $(CLEAR_VARS)
-
- LOCAL_SRC_FILES:= \
- main.cpp \
- testbinder.cpp \
- ../interface/Itestbinder.cpp
-
- LOCAL_SHARED_LIBRARIES := \
- libui libcutils libutils libbinder libsonivox libicuuc libexpat \
- libdl
-
-
- LOCAL_MODULE:= server
- LOCAL_MODULE_TAGS := optional
-
- include $(BUILD_EXECUTABLE)
四、运行
./server
./client
结果:
- result:
-
- 1.client
- root@android:/data # ./client
- TK---->>>>>>Itestbinder.cpp>>>>Bptestbinder::testinterface
- TK-------->>>result is 4
-
- 2.server
- root@android:/data # ./server
- TK---->>>>>>testbinder.cpp>>>>testbinder::onTransact
- TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact
- TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact>>111
- TK---->>>>>>testbinder.cpp>>>>testbinder::testinterface
-
- =============================================================
- I/ ( 624): ServiceManager: 0xc708
- D/ ( 626): TK---->>>>>>Itestbinder.cpp>>>>Bptestbinder::testinterface
- D/ ( 624): TK---->>>>>>testbinder.cpp>>>>testbinder::onTransact
- D/ ( 624): TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact
- D/ ( 624): TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact>>111
- D/ ( 624): TK---->>>>>>testbinder.cpp>>>>testbinder::testinterface
- D/ ( 626): TK-------->>>result is 5