现在的位置: 首页 > 综合 > 正文

如何实现Binder的客户端程序

2013年08月29日 ⁄ 综合 ⁄ 共 4341字 ⁄ 字号 评论关闭

 

参考文献:

http://blog.csdn.net/baiyanning/article/details/6191682

前面一章介绍了如何Binder的服务器端.

接下来就是如何实现客户端程序了.我们将要介绍的客户端可执行程序为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.

这样就表示生成客户端程序了,接下来就是验证我们的程序了.

第4步:

在Android源代码根目录下make 生成system.img文件

第5步:

启动模拟器并用adb连接

用adb 连接

第6步

在模拟器内,查看libExample.so,ExampleServer,Example三个文件.

  1. # ls system/lib/libEx*   
  2. # ls system/bin/Examp  

如下图所示:

第7步:启动ExampleServer

  1. # ./system/bin/ExampleServer&  

第8步:启动客户端程序Example程序

  1. # ./system/bin/Example  

如下图所示:

抱歉!评论已关闭.