硬件平台: FriendlyARM Tiny4412 Cortex-A9

操作系统: UBUNTU 14.04 LTS

时间:2016-09-21  16:58:56

为了避免访问冲突,则创建了硬件访问服务层。

硬件服务需要注册到service manager。

首先:内核驱动 <<-->> LED-HAL硬件抽象层 <<-->>  CPP文件 <<-->> 服务类JAVA。

服务类JAVA包含: aidl 、硬件服务 、注册到ServerManger。

首先编写aidl文件。

在 Android-5.0.2/frameworks/base/core/java/android/os/ 下创建接口文件 ILedServiece.aidl 以Vibrator为基准。

  1. package android.os;
  2.  
  3. /** {@hide} */
  4. interface ILedService    //下面的函数为我们需要的接口函数。
  5. {
  6. int LedOpen();
  7. int LedOn( int no );
  8. int LedOff( int no );
  9.  
  10. }

为了转化到java文件 则修改mk文件。

在 Android-5.0.2/frameworks/base/Android.mk文件中  添加 core/java/android/os/ILedService.aidl \

开始编译

  1. . setenv  //配置环境变量
  2. lunch
  3. mmm frameworks/base  //编译

编译完成后会自动生成文件JAVA文件: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/os/ILedService.java

创建服务类: 在frameworks/base/services/core/java/com/android/server/目录下。

以Vibrator为基准。创建 LedService.java

  1. package com.android.server;
  2.  
  3. import android.util.Slog;
  4. import android.os.ILedService;    //来自自动生成的文件
  5.  
  6. public class LedService extends ILedService.Stub {
  7. private static final String TAG = "LedService";
  8.  
  9. public int LedOpen() throws android.os.RemoteException    //此函数名是从自动生成的java文件ILedService.java中拷贝而来的
  10. {
  11. return native_LedOpen();
  12. }
  13.  
  14. public int LedOn(int no) throws android.os.RemoteException  //此函数名是从自动生成的java文件ILedService.java中拷贝而来的
  15. {
  16. return native_LedOn( no );
  17. }
  18.  
  19. public int LedOff(int no) throws android.os.RemoteException  //此函数名是从自动生成的java文件ILedService.java中拷贝而来的
  20. {
  21. return native_LedOff( no );
  22. }
  23.  
  24. public LedService()
  25. {
  26. Slog.d(TAG,"LedService");
  27. }
  28.  
  29. public static native int native_LedOpen();      //jni的函数声明
  30. public static native int native_LedOn( int no );   //jni的函数声明
  31. public static native int native_LedOff( int no );   //jni的函数声明
  32.  
  33. }

注册到manager。

修改文件 frameworks/base/services/java/com/android/server/SystemServer.java 。

以Vibrator为基准。

添加以下代码:

LedService led = null;

~~~~~~~~~

Slog.i(TAG, "Led Service");
            led = new LedService();
            ServiceManager.addService("led", led);

修改cpp文件。

在frameworks/base/services/core/jni/ 目录下以Vibrator为基准创建文件com_android_server_LedService.cpp

  1. #define LOG_TAG "LedService"
  2.  
  3. #include "jni.h"
  4. #include "JNIHelp.h"
  5. #include "android_runtime/AndroidRuntime.h"
  6.  
  7. #include <utils/misc.h>
  8. #include <utils/Log.h>
  9. #include <hardware/led.h>
  10.  
  11. #include <stdio.h>
  12. struct led_device_t *led_dev;    //此为在HAL硬件抽象层中自己定义的结构体
  13.  
  14. namespace android
  15. {
  16.  
  17. static jint LedOpen( JNIEnv *env, jobject clazz )  //前面两个参数必须要有
  18. {
  19. hw_module_t *module;
  20. hw_device_t *device;
  21. hw_get_module( "led", (hw_module_t const **)&module );  //依靠”led“获取HAL抽象层中的结构体指针
  22.  
  23. module->methods->open( module, NULL, &device);      //依旧是在抽象层中实现的
  24.  
  25. led_dev = (struct led_device_t *)device;
  26.  
  27. return ;
  28. }
  29.  
  30. static jint LedOn( JNIEnv *env, jobject clazz, int no )  //前面两个参数必须要有,后面的为函数自身的参数
  31. {
  32. led_dev->set_on( led_dev, no );
  33. return ;
  34. }
  35.  
  36. static jint LedOff( JNIEnv *env, jobject clazz, int no )
  37. {
  38. led_dev->set_off( led_dev, no );
  39. return ;
  40. }
  41.  
  42. static JNINativeMethod method_table[] = {
  43. { "native_LedOpen", "()I", (void*)LedOpen },  //需要的用到的函数名字( ”java中用到的名字“, (参数)返回值, 在cpp中具体实现的名字 )
  44. { "native_LedOn", "(I)I", (void*)LedOn },
  45. { "native_LedOff", "(I)I", (void*)LedOff },
  46. };
  47.  
  48. int register_android_server_LedService(JNIEnv *env)
  49. {
  50. return jniRegisterNativeMethods(env, "com/android/server/LedService",    //哪个类需要用到
  51. method_table, NELEM(method_table));
  52. }
  53.  
  54. };

完成之后,需要调用  int register_android_server_LedService(JNIEnv *env)  函数。

在frameworks/base/services/core/jni/onload.cpp文件中添加以下代码:

申明:int register_android_server_LedService(JNIEnv *env);

调用:register_android_server_LedService(env);

修改frameworks/base/services/core/jni/Android.mk

添加: $(LOCAL_REL_DIR)/com_android_server_LedService.cpp \

编译: mmm frameworks/base/services/

成功后 生成system.img映像即可。

Android驱动入门-LED--HAL硬件访问服务层②的更多相关文章

  1. Android驱动入门-Led控制+app+ndk库+底层驱动

    硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-20  21:56:48 本次实验使用的是 安卓APP + ...

  2. android驱动学习---led实验

    ======================== 驱动: 内核:android-kernel 2.6.36  (必须对应你的板子上内核,不然会出现insmod错误) 目的:通过android应用层用户 ...

  3. Android驱动入门-LED--HAL硬件抽象层程序设计①

    硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-21  16:15:26 设计HAL硬件抽象层程序,则需要 ...

  4. Android驱动入门-LED--测试APP编写③

    硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-24  10:47:03 在Android Studio中 ...

  5. Android驱动入门-在Android系统上运行JAVA程序

    在linux上运行java程序,直接用javac编译,再用java运行就行了.但是在Android上,由于虚拟机和pc端的不同,所以操作方法也是不一样的. 如果想在Android上运行Hello wo ...

  6. Android驱动学习-APP操作新硬件的两种方法(支持添加的驱动)

    在给Android添加新的驱动后,app要如何使用呢? 正常的使用一个设备,需要getService.但是像LED等我们自己添加的硬件驱动,Android源代码根本没有我们自己添加的服务. 第一种: ...

  7. 硬件访问服务学习笔记_WDS

    1.Android驱动框架App1 App2 App3 App4-------------------硬件访问服务-------------------JNI-------------------C库 ...

  8. LED硬件访问服务(2)——JNI/HAL

    一.系统编程 1.SystemServer.java类中提供了main()方法,说明它是以一个进程的方式存在的,启动后直接执行其run() 2.注册服务ServiceManager.addServic ...

  9. 6.4 Android硬件访问服务编写HAL代码

    JNI向上提供本地函数,向下加载HAL文件,并调用HAL的函数: HAL负责访问驱动程序执行硬件操作 JNI和HAL都是用c语言或者C++语言编写的,JNI加载HAL的实质就是使用dlopen加载动态 ...

随机推荐

  1. 使用js制作一般网站首页图片轮播效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. ae 打开地图文档

    if (openMxdDialog.ShowDialog() == DialogResult.OK) { pathMXD = openMxdDialog.FileName; if (pathMXD ! ...

  3. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q36-Q39)

    Question 36 You are designing a SharePoint 2010 application. You need to design the application so t ...

  4. 一文让你彻底了解iOS字体相关知识

    写本文的契机主要是把自己整理的关于iOS字体方面的知识不断更新写在这篇博文中,用来自己以后查阅. 一.iOS原生字体展示 在label中选择字体的font,并把font由system改成custom后 ...

  5. UITableViewController和延时执行、自定义控件

    1.在UITableViewController中,self.view就是self.tableView, 两个对象的指针地址是一样的 2.自定义类继承UITableViewCell, 重写父类方法 / ...

  6. Android 在C代码中调用logcat

    本文给<Android java传递int类型数组给C>中添加C代码中调用logcat的功能 Android.mk文件增加以下内容 LOCAL_LDLIBS += -llog C代码中增加 ...

  7. OC中的面向对象语法4

    一. 继承 1. 继承的基本用法 l 设计两个类Bird.Dog // Bird的声明 @interface Bird : NSObject { @public int weight; } - (vo ...

  8. mac os 错误提示:下载失败 使用已购页面再试一次 解决方法

    最近由于买了macbook,开始用mac os系统,发现一个奇怪的现象,在app store里下载应用,老是提示:下载失败 使用已购页面再试一次 原来一直不知道怎么解决这个问题,今天研究了下,发现解决 ...

  9. Windows Azure服务

    一. 存储服务 Azure存储服务是云端的文件存储服务,通过http/https访问和权限控制有以下三种特性 1.本地数据中心冗余 (Local Redundant Storage,LRS) 在一个位 ...

  10. nodejs学习笔记(1)--express安装问题:express不是内部也或者外部的命令解决方案

    "Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具.使用 Express 可以快速地搭建一个完 ...