java binder_java编写binder服务实例

文件目录结果如下:

153c8aefd2603f3352d0bf675e053ef6.png

一、 编写AIDL文件

IHelloService.aidl:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 /**{@hide}*/

2 interfaceIHelloService3 {4 voidsayhello();5 intsayhello_to(String name);6 }

View Code

1. 把 IHelloService.aidl 放入 frameworks/base/core/java/android/os

2. 修改 frameworks/base/Android.mk 添加一行

core/java/android/os/IVibratorService.aidl \

+ core/java/android/os/IHelloService.aidl \

3. mmm frameworks/base

4. 它会生成: ./out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/os/IHelloService.java

IHelloService.java自动生成,无需修改

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 /*

2 * This file is auto-generated. DO NOT MODIFY.3 * Original file: frameworks/base/core/java/android/os/IHelloService.aidl4 */

5 /**{@hide}*/

6 public interface IHelloService extendsandroid.os.IInterface7 {8 /**Local-side IPC implementation stub class.*/

9 public static abstract class Stub extends android.os.Binder implementsIHelloService10 {11 private static final java.lang.String DESCRIPTOR = "IHelloService";12 /**Construct the stub at attach it to the interface.*/

13 publicStub()14 {15 this.attachInterface(this, DESCRIPTOR);16 }17 /**

18 * Cast an IBinder object into an IHelloService interface,19 * generating a proxy if needed.20 */

21 public staticIHelloService asInterface(android.os.IBinder obj)22 {23 if ((obj==null)) {24 return null;25 }26 android.os.IInterface iin =obj.queryLocalInterface(DESCRIPTOR);27 if (((iin!=null)&&(iin instanceofIHelloService))) {28 return((IHelloService)iin);29 }30 return newIHelloService.Stub.Proxy(obj);31 }32

33 @Override publicandroid.os.IBinder asBinder()34 {35 return this;36 }37 @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throwsandroid.os.RemoteException38 {39 switch(code)40 {41 caseINTERFACE_TRANSACTION:42 {43 reply.writeString(DESCRIPTOR);44 return true;45 }46 caseTRANSACTION_sayhello:47 {48 data.enforceInterface(DESCRIPTOR);49 this.sayhello();50 reply.writeNoException();51 return true;52 }53 caseTRANSACTION_sayhello_to:54 {55 data.enforceInterface(DESCRIPTOR);56 java.lang.String _arg0;57 _arg0 =data.readString();58 int _result = this.sayhello_to(_arg0);59 reply.writeNoException();60 reply.writeInt(_result);61 return true;62 }63 }64 return super.onTransact(code, data, reply, flags);65 }66

67

68 private static class Proxy implementsIHelloService69 {70 privateandroid.os.IBinder mRemote;71 Proxy(android.os.IBinder remote)72 {73 mRemote =remote;74 }75 @Override publicandroid.os.IBinder asBinder()76 {77 returnmRemote;78 }79 publicjava.lang.String getInterfaceDescriptor()80 {81 returnDESCRIPTOR;82 }83 @Override public void sayhello() throwsandroid.os.RemoteException84 {85 android.os.Parcel _data =android.os.Parcel.obtain();86 android.os.Parcel _reply =android.os.Parcel.obtain();87 try{88 _data.writeInterfaceToken(DESCRIPTOR);89 mRemote.transact(Stub.TRANSACTION_sayhello, _data, _reply, 0);90 _reply.readException();91 }92 finally{93 _reply.recycle();94 _data.recycle();95 }96 }97 @Override public int sayhello_to(java.lang.String name) throwsandroid.os.RemoteException98 {99 android.os.Parcel _data =android.os.Parcel.obtain();100 android.os.Parcel _reply =android.os.Parcel.obtain();101 int_result;102 try{103 _data.writeInterfaceToken(DESCRIPTOR);104 _data.writeString(name);105 mRemote.transact(Stub.TRANSACTION_sayhello_to, _data, _reply, 0);106 _reply.readException();107 _result =_reply.readInt();108 }109 finally{110 _reply.recycle();111 _data.recycle();112 }113 return_result;114 }115 }116

117 static final int TRANSACTION_sayhello = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);118 static final int TRANSACTION_sayhello_to = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);119

120 }121

122 public void sayhello() throwsandroid.os.RemoteException;123 public int sayhello_to(java.lang.String name) throwsandroid.os.RemoteException;124 }

View Code

HelloService.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 importandroid.util.Slog;2

3 /*实现Hello服务的函数*/

4

5 public class HelloService extendsIHelloService.Stub {6 private static final String TAG = "HelloService";7 private int cnt1 = 0;8 private int cnt2 = 0;9

10 public void sayhello() throwsandroid.os.RemoteException {11 cnt1++;12 Slog.i(TAG, "sayhello : cnt = "+cnt1);13 }14

15 public int sayhello_to(java.lang.String name) throwsandroid.os.RemoteException {16 cnt2++;17 Slog.i(TAG, "sayhello_to "+name+" : cnt = "+cnt2);18 returncnt2;19 }20 }

View Code

TestServer.java 服务端测试程序

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 importandroid.util.Slog;2 importandroid.os.ServiceManager;3

4 /*1. addService5 * 2. while(true) { read data, parse data, call function, reply }6 */

7

8 public classTestServer {9 private static final String TAG = "TestServer";10

11 public static voidmain(String args[])12 {13 /*add Service*/

14 Slog.i(TAG, "add hello service");15 ServiceManager.addService("hello", newHelloService());16

17 while (true)18 {19 try{20 Thread.sleep(100);21 } catch(Exception e){}22 }23

24 }25 }26

View Code

TestClient.java 客户端测试程序

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 importandroid.util.Slog;2 importandroid.os.ServiceManager;3 importandroid.os.IBinder;4

5 /*1. getService6 * 2. 调用服务的sayhello,sayhello_to7 *8 */

9

10 /*test_client [name]*/

11

12 public classTestClient {13 private static final String TAG = "TestClient";14

15 public static voidmain(String args[])16 {17 if (args.length == 0)18 {19 System.out.println("Usage: need parameter: [name]");20 return;21 }22

23 if (args[0].equals("hello"))24 {25 /*1. getService*/

26 IBinder binder = ServiceManager.getService("hello");27 if (binder == null)28 {29 System.out.println("can not get hello service");30 Slog.i(TAG, "can not get hello service");31 return;32 }33

34 IHelloService svr =IHelloService.Stub.asInterface(binder);35

36 if (args.length == 1)37 {38 try{39 svr.sayhello();40 System.out.println("call sayhello");41 Slog.i(TAG, "call sayhello");42 } catch(Exception e) {}43 }44 else

45 {46 try{47 int cnt = svr.sayhello_to(args[1]);48 System.out.println("call sayhello_to "+args[1]+" : cnt = "+cnt);49 Slog.i(TAG, "call sayhello_to "+args[1]+" : cnt = "+cnt);50 } catch(Exception e) {}51 }52 }53 }54 }

View Code

Android.mk文件

# Copyright 2008 The Android Open Source Project

#

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := HelloService.java IHelloService.java TestServer.java

LOCAL_MODULE := TestServer

include $(BUILD_JAVA_LIBRARY)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := HelloService.java IHelloService.java TestClient.java

LOCAL_MODULE := TestClient

include $(BUILD_JAVA_LIBRARY)

二、编译:

把程序放到 /work/android-5.0.2/frameworks/testing/APP_Binder_JAVA_App

执行:

. setenv

lunch // 选择单板

mmm frameworks/testing/APP_Binder_JAVA_App

在out目录下它会生成 TestServer.jar, TestClient.jar

(3) 测试:

logcat TestServer:* TestClient:* HelloService:* *:S &

CLASSPATH=/mnt/android_fs/TestServer.jar app_process / TestServer &

CLASSPATH=/mnt/android_fs/TestClient.jar app_process / TestClient hello

CLASSPATH=/mnt/android_fs/TestClient.jar app_process / TestClient hello winfu

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值