1. 程式人生 > >Android驅動(一)硬體訪問服務學習之(二)Android通過硬體訪問服務訪問硬體

Android驅動(一)硬體訪問服務學習之(二)Android通過硬體訪問服務訪問硬體

(2)上傳AIDL檔案 

將AIDL檔案上傳編譯之前,需要先編譯整個安卓原始碼(目前編譯4412開發板)。編譯完後上傳到目錄中,But,哪個目錄?模仿其它AIDL檔案在哪個目錄,然後上傳到相應的目錄。/android-5.0.2/frameworkds/base/core/java/android/os目錄下

逐層查詢android.mk

(3)修改/android-5.0.2/frameworkds/base/下的Android.mk檔案:

增加一行:core/java/android/os/ILedService.aidl\(yy複製當前行 p貼上)

(4)android-5.0.2/frameworkds/base/下輸入mmm  .回車編譯當前目錄/android-5.0.2/frameworkds/base

(5)編譯的結果放在/android-5.0.2/out/下find -name "ILedService.java"。裡面實現了

public interface ILedService extends android.os.IInterface

public static abstract class Stub extends android.os.Binder implements android.os.ILedService

public int ledCtrl(int which, int status) throws android.os.RemoteException;

如何使用參考:核心搜尋IVibratorService.aidl

    private final IVibratorService mService;

    public SystemVibrator() {
        mService = IVibratorService.Stub.asInterface(
                ServiceManager.getService("vibrator"));
    }。。。

mService.hasVibrator();

(6)ILedService.java這個檔案介面如何使用。

先獲取Service,然後將其轉換為介面物件,然後呼叫這個介面物件的成員方法。

總結:

l  編寫ILedService.aidl檔案 ==>編譯生成ILedService.java檔案

l  app使用:ILedService   iLedService;

 iLedService = ILedService.Stub.asInterface(ServiceManager.getService("Led"))

   呼叫:iLedService.ledctrl(0,1);

所以使用者APP層呼叫iLedService介面,但是這個介面並不直接操作硬體,iLedService會把服務請求發給LedService

操作硬體的是LedService.java,下面描述這個LedService.java程式怎麼編寫。注意,這個LedService.java的作用是呼叫本地Native方法來操作硬體。

3.2編寫LedService.java檔案

編寫LedService.java 參考VibratorService.java

(frameworks/base/services/core/java/com/android/server/LedService.java)

ILedService.Stub類裡面有ledCtrl方法,這裡也實現。

package com.android.server;
import android.os.ILedService;

public class LedService extends ILedService.Stub {
    private static final String TAG = "LedService";
	/* call native c function to access hardware */
	public int ledCtrl(int which, int status) throws android.os.RemoteException
	{
		return native_ledCtrl(which, status);
	}
	public LedService() {
		native_ledOpen();
	}
	public static native int native_ledOpen();
	public static native void native_ledClose();
	public static native int native_ledCtrl(int which, int status);
}

3.3修改SystemServer.java

(frameworks/base/services/java/com/android/server/SystemServer.java) startOtherServices: