在Ubuntu 上为Android 系统的Application Frameworks 层增加硬件访问服务

本文详细介绍了如何在Android系统中利用Java接口为硬件服务提供访问途径,包括准备JNI方法调用层、定义通信接口、编译接口、提供硬件服务等关键步骤。通过实现一个自定义的硬件服务HelloService,展示了应用程序如何通过Java接口调用硬件功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行。今天大家对iOS Android系统的趋之若

鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件。因此,软件和硬件的关系,在一定程度上可以说,硬件

是为软件服务的。硬件工程师研发出一款硬件设备,自然少了软件工程师为其编写驱动程序;而驱动程序的最终目的,是为

了使得最上层的应用程序能够使用这些硬件提供的服务来为用户提供软件功能。对Android 系统上的应用软件来说,就是要

在系统的ApplicationFrameworks 层为其提供硬件服务。在前面的几篇文章中,我们着重介绍了Linux 内核层、硬件抽象层和

运行时库层提供的自定义硬件服务接口,这些接口都是通过C 或者C++语言来实现的。在这一篇文章中,我们将介绍如何在

Android 系统的Application Frameworks 层提供Java 接口的硬件服务。

. 参照在Ubuntu Android硬件抽象层(HAL)模块编写JNI 方法提供Java 访问硬件服务接口一文所示,为硬件抽象层模块

准备好JNI 方法调用层。

. Android 系统中,硬件服务一般是运行在一个独立的进程中为各种应用程序提供服务。因此,调用这些硬件服务的应用

程序与这些硬件服务之间的通信需要通过代理来进行。为此, 我们要先定义好通信接口。进入到

frameworks/base/core/java/android/os目录,新增IHelloService.aidl 接口定义文件:

linuxidc@www.linuxidc.com:~/Android$cd frameworks/base/core/java/android/os

linuxidc@www.linuxidc.com:~/Android/frameworks/base/core/java/android/os$vi IHelloService.aidl

IHelloService.aidl 定义了IHelloService 接口:

1.package Android.os;

2.

3.interfaceIHelloService {

4. void setVal(intval);

5. int getVal(); 6.}

IHelloService 接口主要提供了设备和获取硬件寄存器val 的值的功能,分别通过setVal getVal 两个函数来实现。

.返回到frameworks/base 目录,打开Android.mk 文件,修改LOCAL_SRC_FILES 变量的值,增加IHelloService.aidl 源文件:

## READ ME:########################################################

##

## When updating thislist of aidl files, consider if that aidl is

## part of the SDKAPI. If it is, also add it to the list below that

## is preprocessed anddistributed with the SDK. This list should

## not contain anyaidl files for parcelables, but the one below should

## if you intend for3rd parties to be able to send those objects

## across processboundaries.

##

## 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 接口:

linuxidc@www.linuxidc.com:~/Android$mmm frameworks/base

这样,就会根据IHelloService.aidl生成相应的IHelloService.Stub 接口。

.进入到frameworks/base/services/java/com/Android/server目录,新增HelloService.java 文件:

1.packagecom.Android.server;

2.importAndroid.content.Context;

2.importAndroid.os.IHelloService;

3.importAndroid.util.Slog;

4.public classHelloService extends IHelloService.Stub {

5. private staticfinal String TAG = "HelloService";

6. HelloService() {

7. init_native();

8. }

9. public voidsetVal(int val) {

10.setVal_native(val);

11. }

12. public intgetVal() {

13. returngetVal_native();

14. }

15.

16. private staticnative boolean init_native();

17. private staticnative void setVal_native(int val);

18. private staticnative int getVal_native();

19.};

HelloService 主要是通过调用JNI 方法init_nativesetVal_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, "Failurestarting 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

linuxidc@www.linuxidc.com:~/Android$mmm frameworks/base/services/java

linuxidc@www.linuxidc.com:~/Android$make snod

这样,重新打包后的system.img系统镜像文件就在Application Frameworks 层中包含了我们自定义的硬件服务HelloService

了,并且会在系统启动的时候,自动加载HelloService。这时,应用程序就可以通过Java 接口来访问Hello 硬件服务了。我们

将 在下一篇文章http://www.linuxidc.com/Linux/2011-07/38983.htm中描述如何编写一个Java 应用程序来调用这个HelloService

接口来访问硬件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值