多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
在Android系统中,通常把硬件访问服务实现在frameworks/base/services/java/com/android/server目录中。因此,我们把实现了硬件访问服务FregService的FregService.java文件也保存在这个目录中,它的内容如下所示。 **frameworks/base/services/java/com/android/server/FregService.java** ~~~ package com.android.server; import android.content.Context; import android.os.IFregService; import android.util.Slog; public class FregService extends IFregService.Stub { private static final String TAG = "FregService"; private int mPtr = 0; FregService() { mPtr = init_native(); if(mPtr == 0) { Slog.e(TAG, "Failed to initialize freg service."); } } public void setVal(int val) { if(mPtr == 0) { Slog.e(TAG, "Freg service is not initialized."); return; } setVal_native(mPtr, val); } public int getVal() { if(mPtr == 0) { Slog.e(TAG, "Freg service is not initialized."); return 0; } return getVal_native(mPtr); } private static native int init_native(); private static native void setVal_native(int ptr, int val); private static native int getVal_native(int ptr); } ~~~ 硬件访问服务FregService继承了IFregService.Stub类,并且实现了IFregService接口的成员函数setVal和getVal。其中,成员函数setVal通过调用JNI方法setVal_native来写虚拟硬件设备freg的寄存器val,而成员函数getVal调用JNI方法getVal_native来读虚拟硬件设备freg的寄存器val。此外,硬件访问服务FregService在启动时,会通过调用JNI方法init_native来打开虚拟硬件设备freg,并且获得它的一个句柄值,保存在成员变量mPtr中。如果硬件访问服务FregService打开虚拟硬件设备freg失败,那么它的成员变量mPtr的值就等于0;否则,就得到一个大于0的句柄值。这个句柄值实际上是指向虚拟硬件设备freg在硬件抽象层中的一个设备对象,硬件访问服务FregService的成员函数 setVal和getVal在访问虚拟硬件设备freg的寄存器val时,必须要指定这个句柄值,以便硬件访问服务FregService的JNI实现可以知道它所要访问的是哪一个硬件设备。 硬件访问服务FregService编写完成之后,就可以执行mmm命令来重新编译Android系统的services模块了。 ~~~ USER@MACHINE:~/Android$ mmm ./frameworks/base/services/java/ ~~~ 编译后得到的services.jar文件就包含有FregService类。下面我们继续介绍硬件访问服务FregService的JNI实现。