android中c++层binder简单例子

[亡魂溺海] 提交于 2020-04-07 09:44:05

service

  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6.  
  7. using namespace android;
  8.  
  9. #ifdef LOG_TAG
  10. #undef LOG_TAG
  11. #endif
  12. #define LOG_TAG "testService"
  13.  
  14.  
  15. class MyService : public BBinder
  16. {
  17. public:
  18. MyService()
  19. {
  20. mydescriptor = String16("media.hello");
  21. n=0;
  22. }
  23. virtual ~MyService() {}
  24.  
  25. //This function is used when call Parcel::checkInterface(IBinder*)
  26. virtual const String16& getInterfaceDescriptor() const
  27. {
  28. LOGE("this is enter ==========getInterfaceDescriptor");
  29. return mydescriptor;
  30.  
  31. }
  32.  
  33. protected:
  34. void show()
  35. {
  36. LOGE("this is for test show!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
  37. LOGE("this is for test show!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
  38. LOGE("this is for test show!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
  39. LOGE("this is for test show!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
  40. LOGE("this is for test show!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
  41. }
  42. virtual status_t onTransact( uint32_t code,
  43. const Parcel& data,
  44. Parcel* reply,
  45. uint32_t flags = 0)
  46. {
  47. LOGD("enter MyService onTransact and the code is %d",code);
  48. /*
  49. if (data.checkInterface(this))
  50. LOGD("checkInterface OK");
  51. else
  52. {
  53. LOGW("checkInterface failed");
  54. return BBinder::onTransact(code, data, reply, flags);
  55. }
  56. */
  57. switch (code)
  58. {
  59. case 1:
  60. LOGD("MyService interface 1");
  61. break;
  62. case 2:
  63. LOGD("MyService interface 2");
  64. cb = data.readStrongBinder();
  65. break;
  66. case 3:
  67. {
  68. LOGD("MyService interface 3, exit");
  69. //No unregister service routine?
  70.  
  71. //It should return to client first and then call exit in another place.
  72. exit(0);
  73. break;
  74. }
  75. case 4:
  76. {//call cb
  77. LOGD("MyService interface 4 before if================");
  78. cb = data.readStrongBinder();
  79. if (cb != NULL)
  80. {
  81. LOGD("MyService interface 4");
  82. Parcel in, out;
  83. in.writeInterfaceToken(String16("ghq.callback"));
  84. in.writeInt32(n++);
  85. in.writeString16(String16("This is a string."));
  86. cb->transact(1, in, &out, 0);
  87. show();
  88. }
  89. break;
  90. }
  91. default:
  92. return BBinder::onTransact(code, data, reply, flags);
  93. }
  94. return 0;
  95. }
  96.  
  97. private:
  98. String16 mydescriptor;
  99. sp cb;
  100. int n;
  101. };
  102.  
  103.  
  104.  
  105. int main()
  106. {
  107.  
  108. sp sm = defaultServiceManager();
  109.  
  110. status_t ret;
  111.  
  112. //register MyService to ServiceManager
  113. MyService* srv = new MyService();
  114. ret = sm->addService(String16("media.hello"), srv);
  115.  
  116.  
  117. LOGD("addservice media.hello return %d", ret);
  118.  
  119. //call binder thread pool to start
  120. ProcessState::self()->startThreadPool();
  121. IPCThreadState::self()->joinThreadPool(true);
  122. return 0;
  123. }
 
client
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7.  
  8. using namespace android;
  9.  
  10. #ifdef LOG_TAG
  11. #undef LOG_TAG
  12. #endif
  13. #define LOG_TAG "testCallback"
  14.  
  15. class MySetupCallback : public BBinder
  16. {
  17. public:
  18. MySetupCallback()
  19. {
  20. mydescriptor = String16("android.os.ISetupCallback");
  21. }
  22. virtual ~MySetupCallback() {}
  23.  
  24. virtual const String16& getInterfaceDescriptor() const
  25. {
  26. return mydescriptor;
  27. }
  28.  
  29. protected:
  30. virtual status_t onTransact( uint32_t code,
  31. const Parcel& data,
  32. Parcel* reply,
  33. uint32_t flags = 0)
  34. {
  35. LOGD("enter MySetupCallback onTransact, code=%u", code);
  36. if (data.checkInterface(this))
  37. LOGD("checkInterface OK");
  38. else
  39. {
  40. LOGW("checkInterface failed");
  41. return -1;
  42. }
  43. switch (code)
  44. {
  45. default:
  46. break;
  47. }
  48. return 0;
  49. }
  50.  
  51. private:
  52. String16 mydescriptor;
  53. };
  54.  
  55. int main()
  56. {
  57. sp sm = defaultServiceManager();
  58.  
  59. sp b = sm->getService(String16("media.hello")); //Context.MCU_SERVICE
  60.  
  61. if (b == NULL)
  62. {
  63. LOGW("Can't find binder service \"media.hello\"");
  64. return -1;
  65. }
  66.  
  67. Parcel in1,out1;
  68. MySetupCallback *cb = new MySetupCallback();
  69. in1.writeStrongBinder(sp(cb));
  70. int ret = b->transact(4, in1, &out1, 0); //TRANSACTION_registerSetup = 4
  71. LOGD("transact(4) return %d", ret);
  72.  
  73. ProcessState::self()->startThreadPool();
  74. IPCThreadState::self()->joinThreadPool();
  75.  
  76. return 0;
  77. }
 
Android.mk
  1. # Copyright 2006 The Android Open Source Project
  2.  
  3. LOCAL_PATH:= $(call my-dir)
  4. include $(CLEAR_VARS)
  5.  
  6. LOCAL_MODULE_TAGS := eng
  7.  
  8. LOCAL_SRC_FILES:= \
  9.        testCallback.cpp
  10.  
  11. LOCAL_C_INCLUDES += \
  12.         $(LOCAL_PATH) \
  13.         $(LOCAL_PATH)/../include \
  14.         $(LOCAL_PATH)/../include/callback \
  15.  
  16.  
  17. LOCAL_SHARED_LIBRARIES := \
  18.     libcutils \
  19.     libbinder \
  20.     libutils \
  21.     libhardware
  22.  
  23. LOCAL_CFLAGS := -DRIL_SHLIB
  24.  
  25. LOCAL_MODULE:= testCallback
  26.  
  27. include $(BUILD_EXECUTABLE)
  28.  
  29. include $(CLEAR_VARS)
  30.  
  31. LOCAL_MODULE_TAGS := eng
  32.  
  33. LOCAL_SRC_FILES:= \
  34.            testService.cpp
  35.  
  36. LOCAL_C_INCLUDES += \
  37.         $(LOCAL_PATH) \
  38.         $(LOCAL_PATH)/../include \
  39.         $(LOCAL_PATH)/../include/callback \
  40.  
  41.  
  42. LOCAL_SHARED_LIBRARIES := \
  43.     libcutils \
  44.     libbinder \
  45.     libutils \
  46.     libhardware
  47.  
  48. LOCAL_CFLAGS := -DRIL_SHLIB
  49.  
  50. LOCAL_MODULE:= testService
  51.  
  52. include $(BUILD_EXECUTABLE)
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!