6.2、Android硬件访问服务编写系统代码
1、实现接口文件给App使用,接口文件是应用程序查询获得服务时获得
使用AIDL(Android接口定义语言)来实现ILedService.java接口
定义ILedService.aidl
interface ILedService
{
int IedCtrl(int which,int status);
}
把ILedService.aidl放在已经编译好的Android系统源码中的目录:frameworks/base/core/java/android/os目录下,同时修改frameworks/base下的Android.mk文件,其就是makefile文件,其他子目录没有Android.mk文件:仿照其他添加aidl文件添加一句:
core/java/android/os/ILedService.aidl\
接着在frameworks/base目录下执行:mmm . (该命令会帮我们生成ILedService.java文件,同时执行mmm命令的前提是已经成功编译了Android系统)
编译的结果会放到out目录下,进入out目录下搜索:“find -name "ILedService.java”
.out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/os目录下有个ILedService.java文件
App如果使用:ILedService iLedService;
iLedService = ILedService .Stub.asInterface(ServiceManager.getService("led"));
然后调用iLedService.IedCtrl();这个方法会把服务请求发给LedService.java
2、实现LedService.java(可以参考VibratorService.java振动器服务)
package com.android.server;
import android.os.ILedService;
public class LedService extends ILedService.stub{
private static final String TAG = "LedService";
/*call native c function to access hardware*/
public int ledCtrl(int which ,int status) throws android.os.RemoteException//父类ILedService.stub继承接口ILedService,所以接口里面的ledCtrl要实现,可以参考生成的lLedService.java
{
return native_ledCtrl(which ,status);
}
//构造函数
public LedService(){
native_ledOpen();
}
public static native int native_ledCtrl(int which ,int status) ;//这些本地方法由JNI文件提供
public static native int native_ledOpen() ;
public static native void native_ledClose() ;
}
3、修改SystemServer.java
在Slog.i(TAG,"Vibrator Service")下面添加:
Slog.i(TAG,"Led Service");
led = new LedService(context);
ServiceManager.addService("led",led);
4、实现com_android_server_LedService.cpp(JNI文件)(参考com_android_server_VibratorService.cpp),本例中没有实现HAL,其把HAL写到JNI中了,后面会来实现HAL
里面注册本地方法,供LedService.java使用
#define LOG_TAG "LedService"
#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"
#include <utils/misc.h>
#include <utils/Log.h>
#include <hardware_legacy/vibrator.h>
#include <stdio.h>
//还有一些头问题
namespace android
{
static jint fd;
jint ledOpen(JNIEnv *env,jobject cls)
{
fd = open("/dev/leds",O_RDWR);
ALOGI(“native ledOpen:%d”,fd);//打印
if(fd >=0)
return 0;
else
return -1;
}
void ledClose(JNIEnv *env,jobject cls)
{
close(fd);
}
jint ledCtrl(JNIEnv *env,jobject cls,jint which,jint status)
{
int ret = ioctl(fd,status,which);
return ret;
}
static const JNINativeMethod methods[] = {
{"native_ledOpen","()I",(void *)ledOpen},
{"native_ledClose","()V",(void *)ledClose},
{"native_ledCtrl","(II)I",(void *)ledCtrl},
};
int register_android_server_LedService(JNIEnv *env)
{
return jniRegisterNativeMethods(env,"com/android/server/LedService",methods,NELEM(methods));
}
}
5、修改Onload.cpp
添加:register_android_server_LedService(env);并且还要声明,参考register_android_servier_VibratorService(env)
上传各个文件:
A、按照上面添加ILedService.aidl生成ILedService.java
B、
把修改的SystemServer.java和实现的LedService.java上传到:
frameworks/base/services/java/com/android/server/SystemServer.java
frameworks/base/services/core/java/com/android/server/LedServer.java
不需要修改frameworks/base/services/core/Android.mk,其已经通过下面语句全部包含了:
LOCAL_SRC_FILES += \
$(call all-java_files_under,java)
C、JNI:com_android_server_LedService.cpp和onload.cpp
目录:frameworks/base/services/core/jni/onload.cpp
frameworks/base/services/core/jni/com_android_server_LedService.cpp
修改frameworks/base/services/core/jni/Android.mk,添加:
$(LOCAL_REL_DIR)/com_android_server_LedService.cpp\
编译:
mmm frameworks/base/services//修改的文件都在services下面,并且主要是servicess下的Android.mk把子目录下的Android.mk都一层一层包含了,同时也可以看到在services下的Android.mk里面把jni下的哪些cpp编译成了libandroid_servers,就是SystemServer.java中load的C库android_servers.so
make snod//会生成system.img,但是在Android源码顶层目录下和out/target/product/tiny4412/下都有system.img,而且两个不一样
./gen-img.sh //执行这个后,上面两个system.img一样了,如果不执行这句必须用out目录下的system.img
设置为SD卡启动,使用miniTools烧写system.img之后,在设置为nand启动
整体程序说明:
A、SystemServer.java中的main函数调用new SystemServer().run()
B、在run()函数中System.loadLibrary("android_servers")//加载C库,这个C库对应的文件就是Onload.cpp和我们实现的一大堆com_android_server_XXX.cpp(JNI文件)
C、Onload.cpp里面有个JNI_Onload函数在库加载的时候被调用,其会调用JNI中提供的register_android_server_xxxService(env)来注册本地方法函数到服务类LedService,在LedService.java中可以看到起声明了和本地方法对应的函数
D、SystemServer.java函数接着调用startOtherServices()函数来调用ServiceManager.addService(名字,服务类LedService对象)在注册,及告诉ServiceManager进程
E、APP应用程序通过getService(名字)来获得Service
6.2、Android硬件访问服务编写系统代码的更多相关文章
- 2.Android硬件访问服务编写系统代码【转】
本文转载自:https://blog.csdn.net/qq_33443989/article/details/76696772 版权声明:本文为博主(Tower)自学笔记,欢迎转载! :-) ...
- 6.4 Android硬件访问服务编写HAL代码
JNI向上提供本地函数,向下加载HAL文件,并调用HAL的函数: HAL负责访问驱动程序执行硬件操作 JNI和HAL都是用c语言或者C++语言编写的,JNI加载HAL的实质就是使用dlopen加载动态 ...
- 6.1、Android硬件访问服务之框架
1.通过前面led点亮的例子,其流程如下 Android app(java)(通过loadLibrary)——>C library(C库做如下事情)——>1.JNI_Onload 2.jn ...
- 6.5 Android硬件访问服务使用反射
1.前面的例子中App为了能够范问ILedService接口,把classes.jar导入到应用程序中,但是我们不想把classes编进apk包里面去,这样导致我们的apk程序会很大(解压缩apk会发 ...
- 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系统的趋之若鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件.因此,软件和硬件的关系 ...
随机推荐
- BFC的布局规则和触发条件
1 .BFC的含义 : Block Formatting Contexts(BFC) 块级元素格式化上下 ...
- ZJOI2008骑士
Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境 ...
- Apache通用日志工具commons-logging和Log4j使用总结
转自:https://blog.csdn.net/lzl13391522110/article/details/53758536 Apache通用日志工具commons-logging和Log4j使用 ...
- POJ3622 Gourmet Grazers(FHQ Treap)
Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 2363 Accepted: 881 Description Like s ...
- Shiro学习总结(3)——Apache Shiro身份认证
身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和cre ...
- 洛谷 P2240 数的计数数据加强版
P2240 数的计数数据加强版 题目背景 无 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n<=1500001),然后对此自然数按照如下方法进行处理: ...
- 洛谷 P1724 东风谷早苗
P1724 东风谷早苗 题目描述 在幻想乡,东风谷早苗是以高达控闻名的高中生宅巫女.某一天,早苗终于入手了最新款的钢达姆模型.作为最新的钢达姆,当然有了与以往不同的功能了,那就是它能够自动行走,厉害吧 ...
- 解决XCODE配置LLVM环境出现的问题
问题描写叙述:在LLVM整合进XCODE的过程中出现符号没有定义导致出现未决函数或方法.但使用终端编译链接生成程序没有问题. 问题产生原因:未引用响应的LLVM库与系统库,以及编译器设置.连接器设置不 ...
- 第二十八天 月出惊山鸟 —Spring的AOP
6月13日,阴转细雨."人闲桂花落.夜静春山空. 月出惊山鸟.时鸣春涧中." 无论在面向过程还是在面向对象里,奇妙的"纯"字,似乎永远都充满了无限的可能性.除了 ...
- DBLINK做系统集
过度使用DBLINK做系统集成会带来的问题 过度使用DBLINK做系统集成会带来很多问题,问题主要由以下几点: 1. 大量消耗数据库资源: 本地系统每通过DBLINK链接远端系统一次,都会生成一个本地 ...