Ubuntu中为Android实现Application Frameworks层增加硬件访问服务

作者:罗升阳 时间:2021-05-28 14:20:02 

       在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行。今天大家对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$ cd frameworks/base/core/java/android/os

      USER-NAME@MACHINE-NAME:~/Android/frameworks/base/core/java/android/os$ vi IHelloService.aidl

      IHelloService.aidl定义了IHelloService接口:


package android.os;

interface IHelloService {
void setVal(int val);
int getVal();
}

 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$ mmm frameworks/base

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

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


package com.android.server;
import android.content.Context;
import android.os.IHelloService;
import android.util.Slog;
public class HelloService extends IHelloService.Stub {
private static final String TAG = "HelloService";
HelloService() {
init_native();
}
public void setVal(int val) {
setVal_native(val);
}
public int getVal() {
return getVal_native();
}

private static native boolean init_native();
private static native void setVal_native(int val);
private static native int getVal_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$ mmm frameworks/base/services/java

     USER-NAME@MACHINE-NAME:~/Android$ make snod

     这样,重新打包后的system.img系统镜像文件就在Application Frameworks层中包含了我们自定义的硬件服务HelloService了,并且会在系统启动的时候,自动加载HelloService。这时,应用程序就可以通过Java接口来访问Hello硬件服务了。我们将在下一篇文章中描述如何编写一个Java应用程序来调用这个HelloService接口来访问硬件,敬请期待。

标签:Ubuntu,Android,Application,Frameworks
0
投稿

猜你喜欢

  • 一文详解Java中流程控制语句

    2023-11-26 11:39:49
  • Java模拟死锁发生之演绎哲学家进餐问题案例详解

    2022-10-09 22:52:44
  • SpringBoot应用War包形式部署到外部Tomcat的方法

    2021-10-06 04:59:48
  • MyBatis中使用$和#所遇到的问题及解决办法

    2023-03-25 12:27:55
  • Windows+Apache+resin配置

    2023-10-16 08:53:07
  • FeignClient实现接口调用方式(不同参数形式)

    2023-03-06 08:41:39
  • 部署Java在服务器端的EJB组件的方法

    2023-08-26 13:43:38
  • Java结构型设计模式之桥接模式详细讲解

    2023-08-26 16:25:56
  • Tomcat 实现WebSocket详细介绍

    2023-08-12 21:22:11
  • 详解C# 利用反射根据类名创建类的实例对象

    2023-12-20 12:42:41
  • Spring多个数据源配置详解

    2023-09-20 18:22:18
  • java项目中的多线程实践记录

    2023-10-16 16:12:03
  • SpringMVC请求流程源码解析

    2021-08-07 03:35:11
  • C#窗体程序实现全屏及取消全屏步骤

    2023-02-18 11:48:38
  • Java二维数组实战案例

    2022-08-13 08:59:25
  • c# 实现文件上传下载功能的实例代码

    2021-12-10 15:00:30
  • c#获取数组中最大数的值

    2022-07-20 07:49:02
  • Java环境下高德地图Api的使用方式

    2022-06-13 06:43:59
  • 实例讲解Java中random.nextInt()与Math.random()的基础用法

    2023-11-29 12:29:54
  • Java C++实现相同MD5加密算法的方式

    2023-10-12 12:26:02
  • asp之家 软件编程 m.aspxhome.com