热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android从应用层到HRL层调用流程

android从应用层到HRL层调用流程:1.实现自己的LED灯之HAL层代码编写(1)编写Android.mkLOCAL_PATH:$(callmy-dir)inc

android从应用层到HRL层调用流程:


1.实现自己的LED灯HAL层代码编写

  

  (1)编写Android.mk

   LOCAL_PATH := $(call my-dir)
   include $(CLEAR_VARS)
   LOCAL_MODULE_TAGS := optional
   LOCAL_PRELINK_MODULE := false
   LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw   //动态库会放在system/lib/hw文件夹中。
   LOCAL_SHARED_LIBRARIES := liblog
   LOCAL_SRC_FILES := led_hal.c
   LOCAL_MODULE := led.default
   include $(BUILD_SHARED_LIBRARY)





   (2)编写led_hal.h

     #ifndef ANDROID_LED_INTERFACE_H
     #define ANDROID_LED_INTERFACE_H
     #include
     #include
     #include
     #include

__BEGIN_DECLS


struct led_device_t {
    struct hw_device_t common;

int (*led_open)(struct led_device_t* dev);
int (*led_ctrl)(struct led_device_t* dev, int which, int status);   //对led 灯进行操作接口。
};  

__END_DECLS

#endif  // ANDROID_LED_INTERFACE_H





(3)编写led_hal.c 

#define LOG_TAG "LedHal"
#include
#include
#include
#include
#include
#include
#include

#include

#include
#include
#include
#include
#include
#include

static int fd;

/** Close this device */
static int led_close(struct hw_device_t* device)
{
close(fd);
return 0;
}


/** open this device */

static int led_open(struct led_device_t* dev)
{
fd = open("/dev/leds", O_RDWR);
ALOGI("led_open : %d", fd);
if (fd >= 0)
return 0;
else
return -1;
}

//操作ioctl 驱动led 灯。
static int led_ctrl(struct led_device_t* dev, int which, int status)
{
int ret = ioctl(fd, status, which);
ALOGI("led_ctrl : %d, %d, %d", which, status, ret);
return ret;
}


//操作驱动所有的接口。

static struct led_device_t led_dev = {
.common = {
.tag   = HARDWARE_DEVICE_TAG,
.close = led_close,
},
.led_open  = led_open,
.led_ctrl  = led_ctrl,
};

//hal默认方法。

static int led_device_open(const struct hw_module_t* module, const char* id,
        struct hw_device_t** device)
{
*device = &led_dev;
return 0;
}


static struct hw_module_methods_t led_module_methods = {
    .open = led_device_open,
};


struct hw_module_t HAL_MODULE_INFO_SYM = {
.tag = HARDWARE_MODULE_TAG,
    .id = "led",
    .methods = &led_module_methods,
};

//把新文件上传到服务器, 所在目录:
hardware/libhardware/include/hardware/led_hal.h
hardware/libhardware/modules/led/led_hal.c
hardware/libhardware/modules/led/Android.mk


(4)编译动态库

      $ mmm hardware/libhardware/modules/led



2.实现自己的HAL Led灯之JNI层代码编写:

(1)编写JNI代码 

      com_android_server_LedService.cpp



#define LOG_TAG "LedService"
#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include




namespace android
{
static led_device_t* led_device;  //led灯设备。


jint ledOpen(JNIEnv *env, jobject cls)
{
jint err;
    hw_module_t* module;
hw_device_t* device;


ALOGI("native ledOpen ...");


/* 1. hw_get_module */
    err = hw_get_module("led", (hw_module_t const**)&module);  //id ="led"与 led_hal.c 类的方法HAL_MODULE_INFO_SYM 属性  .id = "led"一致
    if (err == 0) {
/* 2. get device : module->methods->open */
   err = module->methods->open(module, NULL, &device);
   if (err == 0) {
/* 3. call led_open */
       led_device = (led_device_t *)device;
return led_device->led_open(led_device);
   } else {
       return -1;
    }
    }


    return -1;
}


void ledClose(JNIEnv *env, jobject cls)
{
//ALOGI("native ledClose ...");
//close(fd);
}




//操作led灯
jint ledCtrl(JNIEnv *env, jobject cls, jint which, jint status)
{
ALOGI("native ledCtrl %d, %d", which, status);
return led_device->led_ctrl(led_device, which, status);
}




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));
}


}


(2)修改frameworks/base/services/core/jni/onload.cpp



       1)在namespace android {}方法中添加

             int register_android_server_LedService(JNIEnv *env);



        2)extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved){}方法中添加

             register_android_server_LedService(env);


(3)修改 frameworks/base/services/core/jni/Android.mk :

        添加   $(LOCAL_REL_DIR)/com_android_server_LedService.cpp \

        


(4)把新文件上传到服务器, 所在目录:


     frameworks/base/services/core/jni/com_android_server_LedService.cpp
   

     

(5)编译:
       $ mmm frameworks/base/services   //重新打包libandroid_servers.so动态库。



3.实现自己的HAL Led灯之Service层代码编写


(1) 编写AIDL     

     1) ILedService.aidl 


        package android.os;


        /** {@hide} */
       interface ILedService
    {
int ledCtrl(int which, int status);
     }


    2)把 ILedService.aidl 放入 frameworks/base/core/java/android/os
    3)修改 frameworks/base/Android.mk  添加一行
          core/java/android/os/IVibratorService.aidl \
       + core/java/android/os/ILedService.aidl \


  (2)编译:mmm frameworks/base

                  它会生成: ./out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/os/ILedService.java

   

  

(3) 编写LedService.java


   







    





     


   

    




推荐阅读
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • 本文详细解析了JSONP(JSON with Padding)的跨域机制及其工作原理。JSONP是一种通过动态创建``标签来实现跨域请求的技术,其核心在于利用了浏览器对``标签的宽松同源策略。文章不仅介绍了JSONP的产生背景,还深入探讨了其具体实现过程,包括如何构造请求、服务器端如何响应以及客户端如何处理返回的数据。此外,还分析了JSONP的优势和局限性,帮助读者全面理解这一技术在现代Web开发中的应用。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 在《PHP应用性能优化实战指南:从理论到实践的全面解析》一文中,作者分享了一次实际的PHP应用优化经验。文章回顾了先前进行的一次优化项目,指出即使系统运行时间较长后出现的各种问题和性能瓶颈,通过采用一些通用的优化策略仍然能够有效解决。文中不仅详细阐述了优化的具体步骤和方法,还结合实例分析了优化前后的性能对比,为读者提供了宝贵的参考和借鉴。 ... [详细]
  • 本文详细解析了如何使用 jQuery 实现一个在浏览器地址栏运行的射击游戏。通过源代码分析,展示了关键的 JavaScript 技术和实现方法,并提供了在线演示链接供读者参考。此外,还介绍了如何在 Visual Studio Code 中进行开发和调试,为开发者提供了实用的技巧和建议。 ... [详细]
  • 本文首先对信息漏洞的基础知识进行了概述,重点介绍了几种常见的信息泄露途径。具体包括目录遍历、PHPINFO信息泄露以及备份文件的不当下载。其中,备份文件下载涉及网站源代码、`.bak`文件、Vim缓存文件和`DS_Store`文件等。目录遍历漏洞的详细分析为后续深入研究奠定了基础。 ... [详细]
  • 从无到有,构建个人专属的操作系统解决方案
    操作系统(OS)被誉为程序员的三大浪漫之一,常被比喻为计算机的灵魂、大脑、内核和基石,其重要性不言而喻。本文将详细介绍如何从零开始构建个人专属的操作系统解决方案,涵盖从需求分析到系统设计、开发与测试的全过程,帮助读者深入理解操作系统的本质与实现方法。 ... [详细]
  • 本文介绍了如何通过掌握 IScroll 技巧来实现流畅的上拉加载和下拉刷新功能。首先,需要按正确的顺序引入相关文件:1. Zepto;2. iScroll.js;3. scroll-probe.js。此外,还提供了完整的代码示例,可在 GitHub 仓库中查看。通过这些步骤,开发者可以轻松实现高效、流畅的滚动效果,提升用户体验。 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
author-avatar
mobiledu2502929447
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有