在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來索引這個句柄,從而來掉用此服務。
導入系統,啓動後你的系統就擁有了你寫的服務。哈哈哈哈