Android Binder机制的Native应用
来源:互联网 发布:周琦比赛数据 编辑:程序博客网 时间:2024/05/29 17:32
mkdir testbinder //创建testbinder目录
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:{ //CHECK_INTERFACE(Itestbinder, data, reply); 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); // 0.5 s } 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.cppLOCAL_SHARED_LIBRARIES := \ libui libcutils libutils libbinder libsonivox libicuuc libexpat \libdlLOCAL_MODULE:= clientLOCAL_MODULE_TAGS := optionalinclude $(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 <utils/Trace.h>#include <binder/Parcel.h>#include <binder/IPCThreadState.h>#include <utils/String16.h>#include <utils/threads.h>#include <utils/Atomic.h>//#include <cutils/bitops.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.cppLOCAL_SHARED_LIBRARIES := \ libui libcutils libutils libbinder libsonivox libicuuc libexpat \libdlLOCAL_MODULE:= serverLOCAL_MODULE_TAGS := optionalinclude $(BUILD_EXECUTABLE)四、运行
./server
./client
结果:
result:1.clientroot@android:/data # ./client TK---->>>>>>Itestbinder.cpp>>>>Bptestbinder::testinterfaceTK-------->>>result is 42.serverroot@android:/data # ./server TK---->>>>>>testbinder.cpp>>>>testbinder::onTransactTK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransactTK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact>>111TK---->>>>>>testbinder.cpp>>>>testbinder::testinterface=============================================================I/ ( 624): ServiceManager: 0xc708D/ ( 626): TK---->>>>>>Itestbinder.cpp>>>>Bptestbinder::testinterfaceD/ ( 624): TK---->>>>>>testbinder.cpp>>>>testbinder::onTransactD/ ( 624): TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransactD/ ( 624): TK---->>>>>>Itestbinder.cpp>>>>Bntestbinder::onTransact>>111D/ ( 624): TK---->>>>>>testbinder.cpp>>>>testbinder::testinterfaceD/ ( 626): TK-------->>>result is 5
0 0
- Android Binder机制的Native应用
- Android Binder机制的Native应用
- Android Binder机制的Native应用—双向通信
- Android Binder机制的Native应用—双向通信
- Android系统的Binder机制及其native层应用
- Android Binder机制的Native应用—双向通信
- Android Binder机制的Native应用&&Android系统RPC与Binder && Android Service学习之AIDL, Parcelable和远程服务
- android Binder机制3---Native层
- android binder机制---native获取ServiceManager
- android的binder机制
- Android的Binder机制
- android的binder机制
- 关于android native层的Ixxx 接口中Binder机制的探讨
- 以Android中MediaServer启动来看Native层的Binder IPC通信机制
- android Binder机制2---Binder的数据结构以及Binder驱动
- Android的Binder机制浅析
- Android的Binder机制浅析
- android的binder机制研究
- 【Objective-C】01-Objective-C概述
- getcwd
- Spring -- spring 中使用jdbc, c3p0连接池, dao概念
- Erlang环境搭建 for mac os
- 字符串倒序(面试题)
- Android Binder机制的Native应用
- CxImage
- 电子政务数据库安全保护的路径创建
- Servlet 单例多线程
- lua utf-8编码的汉字
- getClassLoader().getResourceAsStream()去哪里找资源文件
- MD5加密算法
- 九度题目1015:还是A+B && 2006年浙江大学计算机及软件工程研究生机试真题
- CI框架数据库操作知识点总结