如何定制自己的native service: example (C++)
2016-12-01 18:20
316 查看
IMyService.h:
IMyService.cpp:
ServerDemo.cpp:
将名为”service.myservice”的BnMyService服务添加到ServiceManager,并启动服务
ClientDemo.cpp
编译好后,adb push到手机目录中/system/bin
之后开2个终端:
https://www.processon.com/view/link/583feda2e4b08e313590a25d
#ifndef MY_SERVICE_DEMO #define MY_SERVICE_DEMO #include <stdio.h> #include <binder/IInterface.h> #include <binder/Parcel.h> #include <binder/IBinder.h> #include <binder/ProcessState.h> #include <binder/IPCThreadState.h> #include <binder/IServiceManager.h> using namespace android; namespace android { class IMyService: public IInterface { public: DECLARE_META_INTERFACE(MyService); virtual void sayHello() = 0; }; enum { HELLO = IBinder::FIRST_CALL_TRANSACTION, }; class BpMyService: public BpInterface<IMyService> { public: BpMyService(const sp<IBinder>& impl); virtual void sayHello(); }; class BnMyService: public BnInterface<IMyService> { public: virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0); virtual void sayHello(); }; } #endif |
#include "IMyService.h" namespace android { IMPLEMENT_META_INTERFACE(MyService, "android.demo.IMyService"); // client BpMyService::BpMyService(const sp<IBinder>& impl):BpInterface<IMyService>(impl) { } // to implement client's sayhello method void BpMyService::sayHello() { printf("BpMyService::SayHello\n"); Parcel data, reply; data.writeInterfaceToken(IMyService::getInterfaceDescriptor()); remote()->transact(HELLO, data, &reply); printf("get num from BnService: %d\n", reply.readInt32()); } //Server side: receive remote msg, and handle onTransact() status_t BnMyService::onTransact(uint_t code, const Parcel& data, Parcel* reply, uint32_t flags) { switch(code) { case HELLO: printf("BnMyService:: got the client hello\n"); CHECK_INTERFACE(IMyService, data, reply); sayHello(); reply->writeInt32(2016); return NO_ERROR; break; default: break; } return NO_ERROR; } // Server side: sayHello() void BnMyService::sayHello() { printf("BnMyService::sayHello\n"); }; } |
#include "IMyService.h" int main() { sp <IServiceManager> sm = defaultServiceManager(); sm->addService(String16("service.myservice"), new BnMyService()); android::ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); return 0; } |
ClientDemo.cpp
#include "IMyService.h" int main () { sp <IServiceManager> sm = defaultServiceManager(); sp <IBinder> binder = sm->getService(String16("service.myservice")); sp <IMyService> cs = interface_cast <IMyService> (binder); cs->sayHello(); // Remote call return 0; } |
之后开2个终端:
root@:/ # /system/bin/ServerDemo BnMyService:: got the client hello BnMyService::sayHello |
root@:/ # /system/bin/ClientDemo BpMyService::SayHello get num from BnService: 2016 |
相关文章推荐
- 如何定制自己的native service: example2 (C++)
- 如何定制自己的java service: example
- 如何自己定制"发送到"
- (原創) 如何建立自己的Collection? (.NET) (C#) (C++/CLI) (C/C++)
- 【原创】Service如何关闭启动自己的Activity
- 关于c++和C#如何调用自己用c++写的dll文件
- android 非运营商定制项目如何客制化自己的开关机动画、开关机铃声
- 如何制作自己的Windows Service Pack
- C++ / vs 如何生成自己的静态库(lib)文件
- Flex中如何利用tabStyleName, firstTabStyleName, lastTabStyleName和selectedTabTextStyleName样式定制自己的TabNavigator的例子
- 如何定制自己的窗体形状
- IActivityManager ,ActivityManagerNative,ActivityManagerService之间如何进行工作
- Java-如何定制自己的工具库: mytools or myutil
- [C++ rudiment]如何生成自己的静态库(lib)文件
- [C++ rudiment]如何生成自己的静态库(lib)文件
- 如何在Android源码里查找Java中native方法对应的C++实现
- 如何自己定制事件的API
- Flex中如何利用tabStyleName, firstTabStyleName, lastTabStyleName和selectedTabTextStyleName样式,定制自己的TabNavigator
- 【求助】WINCE定制自己的SDK时如何加入POOM支持?
- Domino如何部署自己定制的servlet