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系统的趋之若鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件.因此,软件和硬件的关系 ...
随机推荐
- Web跨域问题基础
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的,浏览器只 ...
- Kinect 开发 —— 录音
不涉及语音识别~~ <Window x:Class="KinectRecordAudio.MainWindow" xmlns="http://schemas.mic ...
- 多重背包模板 51Nod 1086
有N种物品,每种物品的数量为C1,C2......Cn.从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi ...
- JavaScript--数据结构算法之链表
数组的缺点:数组的长度固定,增删时比较困难要移动元素,而且数据填满再添加元素比较复杂.js:数组有split(),可以任意的分割.不存在上述问题.主要问题是:js数组都被实现成了对象,和其他语言的数组 ...
- Service-监听手机来电
public class MonitorPhone extends Activity { TelephonyManager tManager; @Override protected void onC ...
- 【Codeforces Round #455 (Div. 2) A】Generate Login
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举两个串的前缀长度就好. 组出来. 排序. 取字典序最小的那个. [代码] #include <bits/stdc++.h& ...
- 洛谷 P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib
P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib 题目描述 农民约翰的母牛总是产生最好的肋骨.你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们.农民约翰确定他卖给 ...
- Nodejs源代码分析之Path
今天介绍一下nodejs Path的源代码分析,Path的API文档在https://nodejs.org/dist/latest-v5.x/docs/api/path.html,使用相对简单,在AP ...
- uva 1456(dp)
题意:有n个数字u1,u2,u3-un,每一个数字出现的概率pi = ui/(u1 + u2 + - + un),分成w组.计算期望值. 第一组例子的五个数字例如以下 30 5 10 30 25 分成 ...
- ORA-01078错误举例:SID的大写和小写错误
案例重演: dbca建库.SID:metro --手工建库时实例名小写的metro ...... [oracle@org54 ~]$ export ORACLE_SID=METRO ...