文件目录结果如下:
一、 编写AIDL文件
IHelloService.aidl:
1 /** {@hide} */ 2 interface IHelloService 3 { 4 void sayhello(); 5 int sayhello_to(String name); 6 }
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.aidl 4 */ 5 /** {@hide} */ 6 public interface IHelloService extends android.os.IInterface 7 { 8 /** Local-side IPC implementation stub class. */ 9 public static abstract class Stub extends android.os.Binder implements IHelloService 10 { 11 private static final java.lang.String DESCRIPTOR = "IHelloService"; 12 /** Construct the stub at attach it to the interface. */ 13 public Stub() 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 static IHelloService 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 instanceof IHelloService))) { 28 return ((IHelloService)iin); 29 } 30 return new IHelloService.Stub.Proxy(obj); 31 } 32 33 @Override public android.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) throws android.os.RemoteException 38 { 39 switch (code) 40 { 41 case INTERFACE_TRANSACTION: 42 { 43 reply.writeString(DESCRIPTOR); 44 return true; 45 } 46 case TRANSACTION_sayhello: 47 { 48 data.enforceInterface(DESCRIPTOR); 49 this.sayhello(); 50 reply.writeNoException(); 51 return true; 52 } 53 case TRANSACTION_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 implements IHelloService 69 { 70 private android.os.IBinder mRemote; 71 Proxy(android.os.IBinder remote) 72 { 73 mRemote = remote; 74 } 75 @Override public android.os.IBinder asBinder() 76 { 77 return mRemote; 78 } 79 public java.lang.String getInterfaceDescriptor() 80 { 81 return DESCRIPTOR; 82 } 83 @Override public void sayhello() throws android.os.RemoteException 84 { 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) throws android.os.RemoteException 98 { 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() throws android.os.RemoteException; 123 public int sayhello_to(java.lang.String name) throws android.os.RemoteException; 124 }
HelloService.java
1 import android.util.Slog; 2 3 /* 实现Hello服务的函数 */ 4 5 public class HelloService extends IHelloService.Stub { 6 private static final String TAG = "HelloService"; 7 private int cnt1 = 0; 8 private int cnt2 = 0; 9 10 public void sayhello() throws android.os.RemoteException { 11 cnt1++; 12 Slog.i(TAG, "sayhello : cnt = "+cnt1); 13 } 14 15 public int sayhello_to(java.lang.String name) throws android.os.RemoteException { 16 cnt2++; 17 Slog.i(TAG, "sayhello_to "+name+" : cnt = "+cnt2); 18 return cnt2; 19 } 20 }
TestServer.java 服务端测试程序
1 import android.util.Slog; 2 import android.os.ServiceManager; 3 4 /* 1. addService 5 * 2. while(true) { read data, parse data, call function, reply } 6 */ 7 8 public class TestServer { 9 private static final String TAG = "TestServer"; 10 11 public static void main(String args[]) 12 { 13 /* add Service */ 14 Slog.i(TAG, "add hello service"); 15 ServiceManager.addService("hello", new HelloService()); 16 17 while (true) 18 { 19 try { 20 Thread.sleep(100); 21 } catch (Exception e){} 22 } 23 24 } 25 } 26
TestClient.java 客户端测试程序
1 import android.util.Slog; 2 import android.os.ServiceManager; 3 import android.os.IBinder; 4 5 /* 1. getService 6 * 2. 调用服务的sayhello,sayhello_to 7 * 8 */ 9 10 /* test_client <hello|goodbye> [name] */ 11 12 public class TestClient { 13 private static final String TAG = "TestClient"; 14 15 public static void main(String args[]) 16 { 17 if (args.length == 0) 18 { 19 System.out.println("Usage: need parameter: <hello|goodbye> [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 }
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