在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行。今天大家对iOS和Android系统的趋之若鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件。因此,软件和硬件的关系,在一定程度上可以说,硬件是为软件服务的。硬件工程师研发出一款硬件设备,自然少了软件工程师为其编写驱动程序;而驱动程序的最终目的,是为了使得最上层的应用程序能够使用这些硬件提供的服务来为用户提供软件功能。对Android系统上的应用软件来说,就是要在系统的Application Frameworks层为其提供硬件服务。在前面的几篇文章中,我们着重介绍了Linux内核层、硬件抽象层和运行时库层提供的自定义硬件服务接口,这些接口都是通过C或者C++语言来实现的。在这一篇文章中,我们将介绍如何在Android系统的Application
Frameworks层提供Java接口的硬件服务。
一. 参照在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口一文所示,为硬件抽象层模块准备好JNI方法调用层。
二. 在Android系统中,硬件服务一般是运行在一个独立的进程中为各种应用程序提供服务。因此,调用这些硬件服务的应用程序与这些硬件服务之间的通信需要通过代理来进行。为此,我们要先定义好通信接口。进入到frameworks/base/core/java/android/os目录,新增IHelloService.aidl接口定义文件:
USER-NAME@MACHINE-NAME:~/Android$ cdframeworks/base/core/java/android/os
USER-NAME@MACHINE-NAME:~/Android/frameworks/base/core/java/android/os$ vi IHelloService.aidl
IHelloService.aidl定义了IHelloService接口:
- packageandroid.os;
-
interfaceIHelloService{
-
voidsetVal(intval);
-
intgetVal();
- }
IHelloService接口主要提供了设备和获取硬件寄存器val的值的功能,分别通过setVal和getVal两个函数来实现。
三.返回到frameworks/base目录,打开Android.mk文件,修改LOCAL_SRC_FILES变量的值,增加IHelloService.aidl源文件:
## READ ME: ########################################################
##
## When updating this list of aidl files, consider if that aidl is
## part of the SDK API. If it is, also add it to the list below that
## is preprocessed and distributed with the SDK. This list should
## not contain any aidl files for parcelables, but the one below should
## if you intend for 3rd parties to be able to send those objects
## across process boundaries.
##
## READ ME: ########################################################
LOCAL_SRC_FILES += /
....................................................................
core/java/android/os/IVibratorService.aidl /
core/java/android/os/IHelloService.aidl /
core/java/android/service/urlrenderer/IUrlRendererService.aidl /
.....................................................................
四. 编译IHelloService.aidl接口:
USER-NAME@MACHINE-NAME:~/Android$ mmmframeworks/base
这样,就会根据IHelloService.aidl生成相应的IHelloService.Stub接口。
五.进入到frameworks/base/services/java/com/android/server目录,新增HelloService.java文件:
-
packagecom.android.server;
-
importandroid.content.Context;
-
importandroid.os.IHelloService;
-
importandroid.util.Slog;
-
publicclassHelloServiceextendsIHelloService.Stub{
-
privatestaticfinalStringTAG="HelloService";
-
HelloService(){
-
init_native();
-
}
-
publicvoidsetVal(intval){
-
setVal_native(val);
-
}
-
publicintgetVal(){
-
returngetVal_native();
-
}
-
-
privatestaticnativebooleaninit_native();
-
privatestaticnativevoidsetVal_native(intval);
-
privatestaticnativeintgetVal_native();
- };
HelloService主要是通过调用JNI方法init_native、setVal_native和getVal_native(见在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口一文)来提供硬件服务。
六.修改同目录的SystemServer.java文件,在ServerThread::run函数中增加加载HelloService的代码:
@Override
public void run() {
....................................................................................
try {
Slog.i(TAG, "DiskStats Service");
ServiceManager.addService("diskstats", new DiskStatsService(context));
} catch (Throwable e) {
Slog.e(TAG, "Failure starting DiskStats Service", e);
}
try {
Slog.i(TAG, "Hello Service");
ServiceManager.addService("hello", new HelloService());
} catch (Throwable e) {
Slog.e(TAG, "Failure starting Hello Service", e);
}
......................................................................................
}
七. 编译HelloService和重新打包system.img:
USER-NAME@MACHINE-NAME:~/Android$ mmmframeworks/base/services/java
USER-NAME@MACHINE-NAME:~/Android$ make snod
这样,重新打包后的system.img系统镜像文件就在Application Frameworks层中包含了我们自定义的硬件服务HelloService了,并且会在系统启动的时候,自动加载HelloService。这时,应用程序就可以通过Java接口来访问Hello硬件服务了。我们将在下一篇文章中描述如何编写一个Java应用程序来调用这个HelloService接口来访问硬件,敬请期待。
文章出自:http://blog.csdn.net/luoshengyang/article/details/6578352
分享到:
相关推荐
在数字科技日新月异的今天,软件和硬件的...对Android系统上的应用软件来说,就是要在系统的Application Frameworks层为其提供硬件服务。在前面的几篇文章中,我们着重介绍了Linux内核层、硬件抽象层和运行时库层提供的
我们在Android系统增加硬件服务的目的是为了让应用层的APP能够通过Java接口... 参照在Ubuntu Android实现Application Frameworks层增加硬件访问服务一文,在Application Frameworks层定义好自己的硬件服务HelloService
我们在Android系统增加硬件服务的目的是为了让应用层的...参照在Ubuntu上为Android系统的ApplicationFrameworks层增加硬件访问服务一文,在ApplicationFrameworks层定义好自己的硬件服务HelloService,并提供IHelloSer
实现这两者的目的是为了向更上一层提供硬件访问接口,即为Android的Application Frameworks层提供硬件服务。我们知道,Android系统的应用程序是用Java语言编写的,而硬件驱动程序是用C语言来实现的,那么,Java接口...
Android-2.3.7-frameworks-src,Android源代码,Android_Frameworks层源代码,下载后用eclpse关联源代码文件夹,然后就可以利用eclpse翻看Android Frameworks层的源代码
android frameworks src code about wifi: package android.net.wifi; import android.util.Log; import android.util.Config; import android.net.NetworkInfo; import android.net.NetworkStateTracker; ...
This book explains what frameworks are and how they fit into applications, and offers many object-oriented techniques used in application frameworks.
android_frameworks_base,.zip
Mobile Application Development JavaScript Frameworks 英文azw3 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
android_source/frameworks/base/部分02
多种ajax介绍 Purejavascript: Application Frameworks...
POJO Application Frameworks_ Spring Vs. EJB 3
跨平台性:Linux操作系统可以在多种硬件架构和平台上运行,包括x86、ARM、MIPS等。这使得Linux成为了一种非常灵活的操作系统,适用于各种设备和应用场景。 可定制性:由于Linux的源代码是公开的,用户可以根据自己的...
在Android开发framework层的时候,如果我们想增加自定义的功能,这个时候又不想改动系统原有的组件,那通常我们可以增加自己服务成为系统服务,用自己服务统一来进行管理。 Kernel: v4.4.126 Device: rk3399 ...
在应用层添加一个apk将拦截到的电话和短信保存到新的apk中电话拦截的主要代码在应用层处理短信拦截的主要代码在frameworks层中处理.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考...