在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来索引这个句柄,从而来掉用此服务。
导入系统,启动后你的系统就拥有了你写的服务。哈哈哈哈