文件目录结果如下:
一、 编写AIDL文件
IHelloService.aidl:
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自动生成,无需修改
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
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 服务端测试程序
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 客户端测试程序
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