【手寫實例】在framework上添加訪問硬件驅動的服務

在framework上添加訪問硬件驅動的服務

寫完了jni現在寫調用jni的java服務層代碼,jni實現:
https://blog.csdn.net/daoliting5268/article/details/88294352

ok如果我們只是寫一個控制開發板上的一個IO口的服務相當簡單。
首先文件名,一定要和jni註冊時寫的服務名一樣。
首先服務是在com.android.server包中,先import;
然後建立一個類
public class MydrvService extends IMydrvService.Stub
這個類集成aidl接口實現的接口類,這個後面會講到。

然後在MydrvService類中實現方法,調用jni方法
沒什麼好說的,直接貼上代碼

package com.android.server;

import android.content.Context; 
import android.os.IMydrvService; 
import android.util.Slog;

public class MydrvService extends IMydrvService.Stub
{
    private static final String TAG = "MydrvService";

    private int mptr = 0;

    MydrvService()
    {
        mptr = init_native();

        if (mptr == 0) {
            Slog.e(TAG, "failed to initialize mydrv service.");
        }

    }

    public void setVal(int val)
    {
        if (mptr == 0) {
            Slog.e(TAG, "mydrv service is not initialized.");
        }

        setVal_native(mptr, val);

    }

    private static native int init_native();
    private static native void setVal_native(int ptr, int val);
}

ok服務寫完了,上面IMydrvService.Stub是怎麼實現的呢?
其實它是一個服務接口。
現在framework/base/core/java/android/os/下新建一個IMydrvService.aidl文件。
簡單的很就是一個接口

package android.os; 
interface IMyfakeService 
{ 
    void setVal(int val); 
    int getVal(); 
}

注意這裏的方法就是暴露給應用的,我們要在服務中具體實現這些方法的內容。
然後在framework/base/core目錄下的Android.mk文件中添加此aidl接口。
系統會爲此接口實現接口類:IMydrvService.Stub。

ok,服務已經寫好了,那怎麼讓服務加載在服務層呢,就是怎麼讓服務運行起來呢?
那我們就要在Android啓動的時候加載服務,在SystemServer.java中添加:

            try{
                Slog.i(TAG, "Mydrv Service");
                ServiceManager.addService("Mydrv", new MydrvService());
            } catch (Throwable e){
                Slog.e(TAG, "failure starting Mydrv service");
            }

意思是通過servicemanager把服務加進去,句柄是Mydrv,各進程如果想要調用這個服務就可以通過binder管理servicemanager來索引這個句柄,從而來掉用此服務。

導入系統,啓動後你的系統就擁有了你寫的服務。哈哈哈哈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章