一个Native Service的完整示例.doc_第1页
一个Native Service的完整示例.doc_第2页
一个Native Service的完整示例.doc_第3页
一个Native Service的完整示例.doc_第4页
一个Native Service的完整示例.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一个Native Service的完整示例1. 准备工作(1)因为要调用Android源代码的framework/base里的一些类,所以要确保有android相关源代码(2)需要交叉编译器, 链接器等工具, 这个可以使用anroid源码里提供的工具,也可以使用单独下载的android ndk(3)可选: 如果在模拟器(AVD)上运行和调试, 还需要有编译好或者单独下载的android sdk及相应的组件等等, 关于各种组件需求,见/sdk/installing.html#components提到的Recommended Components, 确保满足Basic需求这里用的环境是android源码+单独下载的SDK(包括sdk toos, sdk platform tools和platform组件)2. 在android源码主目录/development子目录下建立工程目录, 我们的各个模块的代码都将放在这个目录的子目录下cd /android/developmentmkdir zp_module3. 建立service目录,里面放要做的native service源码ZPService.h1. #ifndef ANDROID_ZPSERVICE_H2. #define ANDROID_ZPSERVICE_H3.4. #include5. #include6. #include7.8. namespace android9. 10. classZPService:publicBBinder11. 12. private:13. /mutable Mutex m_Lock;14. /int32_t m_NextConnId;15.16. public:17. staticintInstance();18. ZPService();19. virtualZPService();20. virtual status_t onTransact(uint32_t,constParcel&,Parcel*,uint32_t);21. ;22. 23.24. #endifZPService.cpp1. #include2. #include3. #includeZPService.h4.5. namespace android6. 7. /static struct sigaction oldact;8. static pthread_key_t sigbuskey;9. 10. intZPService:Instance()11. 12. LOGE(ZPService Instantiaten);13. intret=defaultServiceManager()-addService(14. String16(zp.svc),new ZPService();15. LOGE(ZPService ret = %dn,ret);16. return ret;17. 18.19. ZPService:ZPService()20. 21. LOGV(ZPService createn);22. /m_NextConnId=1;23. pthread_key_create(&sigbuskey,NULL);24. 25.26. ZPService:ZPService()27. 28. pthread_key_delete(sigbuskey);29. LOGV(ZPService destoryn);30. 31.32. status_t ZPService:onTransact(uint32_t code,33. constParcel&data,34. Parcel*reply,35. uint32_t flags)36. 37. switch(code)38. 39. case0:40. 41. pid_t pid=data.readInt32();42. intnum=data.readInt32();43. num+=1000;44. reply-writeInt32(num);45. return NO_ERROR;46. break;47. default:48. return BBinder:onTransact(code,data,reply,flags);49. 50. 51. Android.mk1. LOCAL_PATH:=$(callmy-dir)2. include $(CLEAR_VARS)3. LOCAL_SRC_FILES:=ZPService.cpp4. LOCAL_SHARED_LIBRARIES:=libutils libbinder5. LOCAL_MODULE_TAGS:=optional6. LOCAL_MODULE:=libZPService7. LOCAL_PRELINK_MODULE:=false8. include $(BUILD_SHARED_LIBRARY)4. 建立svcserver目录,放置server源代码, 它主要用来将我们的service注册到系统.zpserver.cpp1. #include2. #include3. #include4. #include5. #include6. #include7. #include8. #include9. #include./service/ZPService.h10.11. using namespace android;12.13.14. intmain(intarg,char*argv)15. 16. printf(server - ain() beginn);17. spproc(ProcessState:self();18. spsm=defaultServiceManager();19. /LOGI(ServiceManager: %pn,sm.get();20. printf(server - erviceManager: %pn,sm.get();21. intret=ZPService:Instance();22. printf(server - ZPService:Instance return %dn,ret);23. ProcessState:self()-startThreadPool();Android.mk1. LOCAL_PATH:=$(callmy-dir)2. include $(CLEAR_VARS)3. LOCAL_SRC_FILES:=zpserver.cpp4. LOCAL_SHARED_LIBRARIES:=libutils libbinder libZPService5. LOCAL_MODULE_TAGS:=optional6. LOCAL_MODULE:=zpserver7. include $(BUILD_EXECUTABLE)5. 创建svcclient目录, 放置client源代码,它用于调用service提供的服务. 它编译成一个动态库,供其他可执行程序调用, 也可以直接将它和第6步的调用程序直接编译成一个可执行文件ZPClient.h1. #ifndef ANDROID_ZPCLIENT_H2. #define ANDROID_ZPCLIENT_H3.4. namespace android5. 6. classZPClient7. 8. public:9. intsetN(intn);10. private:11. static void getZPService();12. ;13. 14.15. #endifZPClient.cpp点击(此处)折叠或打开1. #include2. #include3. #includeZPClient.h4.5.6. namespace android7. 8. spbinder;9. 10. intZPClient:setN(intn)11. 12. getZPService();13. Parcel data,reply;14. data.writeInt32(getpid();15. data.writeInt32(n);16. 17. LOGE(client - binder-transact()n);18. binder-transact(0,data,&reply);19. intr=reply.readInt32();20. return r;21. 22.23. void ZPClient:getZPService()24. 25. spsm=defaultServiceManager();26. binder=sm-getService(String16(zp.svc);27. LOGE(client - etService: %pn,sm.get();28. if(binder=0)29. 30. LOGW(ZPService not published, waiting.);31. return;32. 33. 34.35. Android.mk1. LOCAL_PATH:=$(callmy-dir)2. include $(CLEAR_VARS)3. LOCAL_SRC_FILES:=ZPClient.cpp4. LOCAL_SHARED_LIBRARIES:=libutils libbinder5. LOCAL_MODULE_TAGS:=optional6. LOCAL_MODULE:=libZPClient7. LOCAL_PRELINK_MODULE:=false8. include $(BUILD_SHARED_LIBRARY)6. 创建svctest目录, 在里面开发一个测试程序,调用第5步的client库提供的接口,访问我们的servicetest.cpp1. #include2. #include./svcclient/ZPClient.h3.4. using namespace android;5.6. intmain(intargc,char*argv)7. 8. ZPClient client;9. intret=client.setN(2012);10. printf(setN return: %dn,ret);11. return 0;12. Android.mk1. LOCAL_PATH:=$(call my-dir)2. include $(CLEAR_VARS)3. LOCAL_SRC_FILES:=test.cpp4. LOCAL_SHARED_LIBRARIES:=libZPClient5. LOCAL_MODULE_TAGS:=optional6. LOCAL_MODULE:=svctest7. include $(BUILD_EXECUTABLE)完成以上几步后, 我们的工程的目录结构如下(zp_module的父目录是development):点击(此处)折叠或打开1. zp_module/2. |-Android.mk3. |-service4. |-Android.mk5. |-ZPService.cpp6. |-ZPService.h7. |-svcclient8. |-Android.mk9. |-ZPClient.cpp10. |-ZPClient.h11. |-svcserver12. |-Android.mk13. |-zpserver.cpp14. -svctest15. |-Android.mk16. -test.cpp7. 编译所有项目第一种方法, 进入android源码主目录,运行source build/envsetup.sh 或 . build/envsetup.sh然后进入development下你的源代码的各个子目录, 根据信赖性先后依次编译各个项目,比如进入development/zp_module/service, 运行 mm第二种方法, 在zp_module下创建一个Android.mk文件, 输入以下内容:1. include $(callall-subdir-makefiles然后直接在zp_module目录下运行mm8. 在模拟器里调试编译好的东西(1) 打开emulatoremulator -avd avd4.0.3 -scale 0.6 -partition-size 256(2) 打开adb, 等avd就绪后(用adb get-state查看状态,为device即准备好), 将编译好的库和可执行程序送入模拟器1. zpzp-desktop:$adb remount2. remount succeeded3. zpzp-desktop:$adb push/home/zp/android/out/target/product/generic/system/lib/libZPService.so/system/lib4. 210 KB/s(10216 bytesin0.047s)5. zpzp-desktop:$adb push/home/zp/android/out/target/product/generic

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论