android从驱动层到应用层_第1页
android从驱动层到应用层_第2页
android从驱动层到应用层_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android 从驱动层到应用程序层的通信 研究一下 Android 从驱动层到应用层的通信机制是很有必要的,如新增加一个硬件并在应 用层去控制硬件都需要用到,目的是知道需要增加哪些东西删改哪些东西而让系统依然工 作正常。 总共需要增改的有四个东西,驱动、服务(jni、java)、应用 apk 采用的方式是在驱动层写个字符型设备驱动其中内含一个定时器,每隔 2 秒发送一个 uevent 事件并改变 sys 下相关文件的内容,然后建立一个服务去读取文件并通过 intent 向上层广播,最后在应用程序层接收此事件并在 TextView 中显示出来 一、驱动层 kernel/drivers/char/uevent_test/test.c Kconfig Makefile 驱动层与服务层之间用到的通信机制是 sys 文件系统的 uevent 机制,涉及的函数有以下几 个 在 sys 文件系统下建立一个类 class_create(THIS_MODULE, “uevent_timer“); 在类里建立一个设备 device_create(uevent_timer_class, NULL, UEVENT_TIMER_MAJOR, NULL, “uevent_timer_status“); 在设备目录下建立一个文件 device_create(uevent_timer_class, NULL, UEVENT_TIMER_MAJOR, NULL, “uevent_timer_status“); 在本项目中建立的目录文件是/sys/class/uevent_timer/uevent_timer_status/status 注意思在使用 kobject_uevent 函数发送 uevent 事件时需要建立一个工作队列来发送,否 则会在发送过程中内核死掉。 INIT_WORK( 通过 schedule_work(来调用 timer_change_work 函 数,在此函数中利用 kobject_uevent( 来发送 uevent 事件. 当上层读取 file 时会调用 uevent_timer_show_attrs 函数来更新及显示文件内容 当上层写入 file 时会调用 uevent_timer_store_attrs 函数来更新及写入文件内容 二、服务层 新建以下两个文件 frameworks/base/services/jni/com_android_server_UeventTimerService.cpp frameworks/base/services/jni/onload.cpp frameworks/base/services/java/com/android/server/UeventTimerService.java frameworks/base/services/java/com/android/server/SystemServer.java (1)JNI 层 JNI 是 java 调用本地的接口,JNI 主要工作是打开驱动所创建的 file 并将其值读出来, 在 static int readFromFile(const char* path, char* buf, size_t size)函 数中读取值 使用 static JNINativeMethod sMethods = /* name, signature, funcPtr */ “native_update“, “()V“, (void*)android_server_UeventTimerService_update, ;注册一个函数 native_update 以供服务的 java 层调用 修改 onload.cpp,在其中加入 int register_android_server_UeventTimerService(JNIEnv* env);在 JNI_OnLoad 中加入 register_android_server_UeventTimerService(JNIEnv* env);在加载时启动此服务 (2)java 层 建立一个类 Class UeventTimerService extends Binder Private int mUeventTimerStatus; Public UeventTimerService()/ mUEventObserver.startObserving(“SUBSYSTEM=uevent_timer“); ;/此函数中调用开始服务 private UEventObserver mUEventObserver = new UEventObserver() Override public void onUEvent(UEventObserver.UEvent event) update(); sendIntent(); ;建立一个服务并重写 onUEvent 函数 private native void native_update(); private synchronized final void update() native_update();/调用 jni 中注册的 native_update()函数 private final void sendIntent() Intent intent = new Intent(“uevent_timer_status“);/启动广播 intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);/建立一个发送 intent.putExtra(“status“, mUeventTimerStatus);/发送变量 ActivityManagerNative.broadcastStickyIntent(intent, null);/向上层广播 在 SystemServer.java 中加入 UeventTimerService ueventtimer = null; 在 try catch 块中加入 ueventtimer = new UeventTimerService(); ServiceManager.addService(“ueventtimer“, ueventtimer); 三、应用层 apk onResume() super.onResume(); IntentFilter filter = new IntentFilter(); filter.addAction(“uevent_timer_status“); registerReceiver(mBroadcastReceiver, filter); onPause() super.onPause(); unregisterReceiver(mBroadcastReceiver); private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() Override public void onReceive(Context context, Intent intent) String action = intent.getAction(); if (action.equals(“uevent_timer_status“) int status = intent.getIntExtra(“status“, 0); String statusString = “; switch (status) case 0: statusString = “counting“; break; case 1: statusStri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论