我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

       在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行。今天大家对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_class="lazy" data-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_class="lazy" data-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接口来访问硬件,敬请期待。

 以上就是Android Application Frameworks层增加硬件访问服务实现方法,后续继续补充相关知识,谢谢大家的支持!

您可能感兴趣的文章:Ubuntu中为Android系统实现内置Java应用程序测试Application Frameworks层的硬件服务Zend Framework教程之Application用法实例详解Zend Framework教程之Application和Bootstrap用法详解Zend Framework教程之配置文件application.ini解析Android Framework Application Framework层简单介绍


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行。今天大家对iOS和Android系统的趋之若鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件。因此,软件和硬件的关系,在一定程度上可以说,硬件
2022-06-06

Ubuntu中为Android系统实现内置Java应用程序测试Application Frameworks层的硬件服务

我们在Android系统增加硬件服务的目的是为了让应用层的APP能够通过Java接口来访问硬件服务。那么, APP如何通过Java接口来访问Application Frameworks层提供的硬件服务呢?在这一篇文章中,我们将在Androi
2022-06-06

Ubuntu中为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序

在Ubuntu Android简单介绍硬件抽象层(HAL)一文中,我们简要介绍了在Android系统为为硬件编写驱动程序的方法。简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的硬件抽象层中。接着Ub
2022-06-06

Ubuntu中为Android HAL编写JNI方法提供JAVA访问硬件服务接口

在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接口。实现这两者的目的是为了向更上一层提供硬件访问接口,即为Android的Application
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录