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);
}