6.5 Android硬件访问服务使用反射
1、前面的例子中App为了能够范问ILedService接口,把classes.jar导入到应用程序中,但是我们不想把classes编进apk包里面去,这样导致我们的apk程序会很大(解压缩apk会发现里面有classes.dex和classes2.dex这两个优化后的包)
因此这里修改编译选项:
在Android studio中
file->Project Structure->点击左边我们的app->点击右边的Dependencies,找到下面的classes,其Scope列表中的值改为Provided
2、app应用程序如何使用反射来访问硬件服务,已之前写的app为例
A、去掉import android.os.ILedService和import android.os.ServiceManager,同时新增import android.os.IBinder
B、在类中新增变量:Object proxy ;Method lec_ctrl
C、去掉iLedService =ILedService.stub.asInterface(ServiceManager.getService("led")); 并使用反射来实现该功能:
Method getService = Class.forName("android.os.ServiceManager").getMethod("getService",String.class)//getService的第一个参数是获得的方法名字
Object ledService = getService.invoke(null,"led")//第一个参数应该是实例化对象,但是getService方法是static的,所有不用实例化对象,‘led’就是getService的参数,invoke虽然是调用ledService函数,这个函数返回IBinder对象,但invoke返回的是Object,这个IBinder会向上转化为Object
//IBinder ledService = (IBinder)getService.invoke(null,"led");//功能同上面一句
/*到这里为止已经实现了ServiceManager.getService("led")的功能*/
Method asInterface= Class.forName("android.os.ILedService$Stub").getMethod("asInterface",IBinder.class);//这里的“$”表示子类
proxy = asInterface.invoke(null,ledService );//asInterface方法返回的是个Proxy对象,代码里面没有声明,所有这里使用父类Object来接收,
/*这里为止我们实现了iLedService =ILedService.stub.asInterface(ServiceManager.getService("led"));功能*/
/*下面我们来获得类Proxy里面的led_ctrl函数*/
lec_ctrl= Class.forName("android.os.ILedService$Stub$Proxy").getMethod("led_ctrl",int.class,int.class);
/*使用led_ctrl来点灯*/
lec_ctrl.invoke(proxy ,0,1);
接着我们就可以在app中使用Proxy类型对象proxy里面的led_ctrl来操作led了//Proxy类在ILedService.java中实现1
D、修改catch异常,去掉以前添加的try...catch...代码,在选中代码后,ctrl+alt+T,选择try catch
在android studio中的log界面也可以设置过滤器,设置Tag为LedHal
6.5 Android硬件访问服务使用反射的更多相关文章
- 2.Android硬件访问服务编写系统代码【转】
本文转载自:https://blog.csdn.net/qq_33443989/article/details/76696772 版权声明:本文为博主(Tower)自学笔记,欢迎转载! :-) ...
- 6.1、Android硬件访问服务之框架
1.通过前面led点亮的例子,其流程如下 Android app(java)(通过loadLibrary)——>C library(C库做如下事情)——>1.JNI_Onload 2.jn ...
- 6.4 Android硬件访问服务编写HAL代码
JNI向上提供本地函数,向下加载HAL文件,并调用HAL的函数: HAL负责访问驱动程序执行硬件操作 JNI和HAL都是用c语言或者C++语言编写的,JNI加载HAL的实质就是使用dlopen加载动态 ...
- 6.2、Android硬件访问服务编写系统代码
1.实现接口文件给App使用,接口文件是应用程序查询获得服务时获得 使用AIDL(Android接口定义语言)来实现ILedService.java接口 定义ILedService.aidl inte ...
- Android硬件访问服务中的HAL-查看打印的信息
JNI 向上提供本地函数,向下加载HAL文件并调用HAL的函数 HAL 负责访问驱动程序执行硬件操作. external\chromium_org\third_party\hwcplus\src\h ...
- 6.3 Android硬件访问服务APP代码
以下步骤是操作MainActivity类 1.导入包 import android.os.ILedService 2.添加成员变量 private ILedService iLedService = ...
- 硬件访问服务学习笔记_WDS
1.Android驱动框架App1 App2 App3 App4-------------------硬件访问服务-------------------JNI-------------------C库 ...
- LED硬件访问服务(2)——JNI/HAL
一.系统编程 1.SystemServer.java类中提供了main()方法,说明它是以一个进程的方式存在的,启动后直接执行其run() 2.注册服务ServiceManager.addServic ...
- 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务(老罗学习笔记5)
在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行.今天大家对iOS和Android系统的趋之若鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件.因此,软件和硬件的关系 ...
随机推荐
- vue -- 跨域cookie 丢失的问题
前端使用了vue-reource的$http进行请求后台接口 登陆完成后,服务端监控发现无法拿到cookie,下面看几张前端控制台监控的图 reqqust Header 没有显示cookie 信息 ...
- pipPython运维日记
一 Python 工作环境管理 1.1 使用 pyenv 管理不同的Python 版本 克隆项目安装 git clone https://github.com/yyuu/pyenv.git ~/.py ...
- 最短路 spfa, dijkstra, Floyd
spfa #include <stdio.h> #include <queue> using namespace std; #define RANGE 101 #define ...
- javaweb一
JavaWeb就是在服务器端以Java语言为解释运行基础的web程序. php代码要想在服务器端运行,需要在服务器软件(通常是Apache)上加php的解释器,Java也一样,但是这个解释器是Tomc ...
- 体验 Windows 系统 CVM
添加角色功能: service.msc 设置自动服务,net start telnet
- C# WinForm设置透明
1:通过设置窗体的 TransparencyKey实现 例:窗体中的白色会变成透明 this.BackColor =Color.White; this.TransparencyKey = ...
- SpringMVC框架中的异常解析器-ExceptionHandler和HandlerExceptionResolver
SpringMVC框架中,处理异常还是挺方便的,提供了一个异常解析器. 处理局部异常 @Controller public class AccessController { /** * 处理这个Con ...
- 阅读笔记—EL表达式
表达式语言(EL) 表达式语言是一种在JSP页面中使用的数据访问语言,通过它可以很方便地在JSP页面中访问应用程序数据. 使用EL访问数据 表达式语言的使用形式: ${exp ...
- 【习题 8-10 UVA - 1614】Hell on the Markets
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 证明:前i个数一定能凑够1..sum[i]中的所有数字 i=1时显然成立. 现在假设i>=2时结论成立 即前i个数字能凑出1. ...
- CODEVS——T2744 养鱼喂妹纸
http://codevs.cn/problem/2744/ 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Descr ...