歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

手把手教你如何實現Binder的客戶端程序(圖文)

前面一章介紹了如何Binder的服務器端. 見 http://www.linuxidc.com/Linux/2012-01/50766.htm

接下來就是如何實現客戶端程序了.我們將要介紹的客戶端可執行程序為Example

第1步:

在framework/base目錄下新建一個ExampleClient目錄,用以保存客戶端源代碼:

  1. $cd framework/base/  
  2. $mkdir ExampleClient  
  3. $cd ExampleClient/  

第2步:

在 這個ExampleClient目錄下有3個源文件:Example.h,Example.cpp,Android.mk

其中Example.h的文件內容如下:

  1. // File: Example.h   
  2. #ifndef ANDROID_BYN_EXAMPLE_H   
  3. #define ANDROID_BYN_EXAMPLE_H   
  4.   
  5. namespace android  
  6. {  
  7.     class Example {  
  8.     public:  
  9.         void add100(int n);  
  10.         private:  
  11.         static const void getExampleService();  
  12.     };  
  13. }; //namespace    
  14. #endif // ANDROID_BYN_EXAMPLE_H  
Example.cpp的文件內容如下:
  1. // File: Example.cpp   
  2. #include <binder/IServiceManager.h>   
  3. #include <binder/IPCThreadState.h>   
  4. #include "Example.h"   
  5.   
  6. namespace android  
  7. {  
  8.     sp<IBinder> binder;  
  9.     void Example::add100(int n)  
  10.     {  
  11.         getExampleService();  
  12.         Parcel data, reply;  
  13.         int answer;  
  14.           
  15.         data.writeInt32(getpid());  
  16.         data.writeInt32(n);  
  17.         LOGE("BpExampleService::create remote()->transact()/n");  
  18.         binder->transact(0, data, &reply);  
  19.         answer = reply.readInt32();  
  20.         printf("answner=%d/n", answer);      
  21.         return;  
  22.     }  
  23.   
  24.     const void Example::getExampleService()  
  25.     {  
  26.         sp<IServiceManager> sm = defaultServiceManager();  
  27.         binder = sm->getService(String16("byn.example"));  
  28.         LOGE("Example::getExampleService %p/n",sm.get());  
  29.         if (binder == 0) {  
  30.             LOGW("ExampleService not published, waiting...");  
  31.         return;  
  32.         }  
  33.     }  
  34. }; //namespace   
  35.   
  36. using namespace android;  
  37.   
  38. int main(int argc, char** argv)  
  39. {  
  40.     Example* p = new Example();  
  41.     p->add100(1);  
  42.     return 0;  
  43. }  
Android.mk文件的內容如下:
  1. # File: Example   
  2. LOCAL_PATH:= $(call my-dir)  
  3. include $(CLEAR_VARS)  
  4. LOCAL_SRC_FILES:= \  
  5.     Example.cpp  
  6. LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)  
  7. LOCAL_SHARED_LIBRARIES := \  
  8.     libutils libbinder libExample  
  9. LOCAL_MODULE_TAGS := optional  
  10. LOCAL_PRELINK_MODULE := false  
  11. LOCAL_MODULE := Example  
  12.   
  13. include $(BUILD_EXECUTABLE)  

第3步:

編譯Example可執行程序:

  1. $cd ~/WORKING_DIRECTORY/  
  2. $mmm framework/base/ExampleClient  
如下圖:

編譯完後,在out/target/product/generic/system/bin/目錄下可以看到可執行程序Example.

這樣就表示生成客戶端程序了,接下來就是驗證我們的程序了.

Copyright © Linux教程網 All Rights Reserved