android应用如何访问C库 - 落魄影子 - 博客频道 - CSDN.NET  http://blog.csdn.net/ab198604/article/details/51249303

Android硬件访问服务框架代码编写 - 落魄影子 - 博客频道 - CSDN.NET  http://blog.csdn.net/ab198604/article/details/51397586

4 编写HAL代码

源码下载方法
第一次:
git clone https://github.com/weidongshan/SYS_0001_LEDDemo.git
更新:
git pull origin
取出指定版本:
git checkout v1 // 有JNI没有HAL
git checkout v2 // 有JNI,HAL
git checkout v3 // add MODULE TAG, DEVICE TAG

JNI 向上提供本地函数, 向下加载HAL文件并调用HAL的函数
HAL 负责访问驱动程序执行硬件操作

dlopen

external\chromium_org\third_party\hwcplus\src\hardware.c   (参考代码)
hw_get_module("led")

1. 模块名==>文件名
hw_get_module_by_class("led", NULL)
name = "led"
property_get xxx是某个属性
hw_module_exists 判断是否存在led.xxx.so

它用来判断"name"."subname".so文件是否存在
查找的目录:
a. HAL_LIBRARY_PATH 环境变量

b. /vendor/lib/hw

c. /system/lib/hw

/vendor/lib/hw 这个目录下没有文件,tiny4412所以只能去/system/lib/hw这个目录下找

2. 加载
load
dlopen(filename)
dlsym("HMI") 从SO文件中获得名为HMI的hw_module_t结构体
strcmp(id, hmi->id) 判断名字是否一致(hmi->id, "led")

V2:
(3) JNI: 重新上传
frameworks/base/services/core/jni/com_android_server_LedService.cpp

(4) HAL: led_hal.h
led_hal.c
把新文件上传到服务器, 所在目录:
hardware/libhardware/include/hardware/led_hal.h

hardware/libhardware/modules 在这个目录下创建一个目录led,放入led_hal.c和自己写一个Android.mk

hardware/libhardware/modules/led/led_hal.c
hardware/libhardware/modules/led/Android.mk

Android.mk内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := led.default
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_C_INCLUDES := hardware/libhardware
LOCAL_SRC_FILES := led_hal.c
LOCAL_SHARED_LIBRARIES := liblog
LOCAL_MODULE_TAGS := eng

include $(BUILD_SHARED_LIBRARY)

编译:

$ mmm frameworks/base/services
$ mmm hardware/libhardware/modules/led
$ make snod
$ ./gen-img.sh

最终生成system.img文件

打印信息简介:
a. 有三类打印信息: app, system, radio
程序里使用 ALOGx, SLOGx, RLOGx来打印
b. x表示6种打印级别,有:
V    Verbose
D    Debug
I     Info
W   Warn
E    Error
F    Fatal

比如:
#define LOG_TAG "LedHal"
ALOGI("led_open : %d", fd);

c. 打印出来的格式为:
I/LedHal ( 1987): led_open : 65
(级别) LOG_TAG 进程号 打印信息

d. 使用 logcat 命令查看
logcat LedHal:I *:S

选出自己感兴趣的信息:

和上一个章节相比,主要修改了

com_android_server_LedService.cpp

添加了led_hal.h   led_hal.c  Android.mk

com_android_server_LedService.cpp

#define LOG_TAG "LedService"#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"#include <utils/misc.h>
#include <utils/Log.h>#include <stdio.h>#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <hardware/led_hal.h>namespace android
{static led_device_t* led_device;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);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);
}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));
}}

led_hal.c

#define LOG_TAG "LedHal"/* 1. 实现一个名为HMI的hw_module_t结构体 *//* 2. 实现一个open函数, 它返回led_device_t结构体 *//* 3. 实现led_device_t结构体 *//* 参考 hardware\libhardware\modules\vibrator\vibrator.c*/#include <hardware/vibrator.h>
#include <hardware/hardware.h>#include <cutils/log.h>#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>#include <hardware/led_hal.h>#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <utils/Log.h>static int fd;/** Close this device */
static int led_close(struct hw_device_t* device)
{close(fd);return 0;
}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;elsereturn -1;
}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,
};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,
};

led_hal.h

#ifndef ANDROID_LED_INTERFACE_H
#define ANDROID_LED_INTERFACE_H#include <stdint.h>
#include <sys/cdefs.h>
#include <sys/types.h>#include <hardware/hardware.h>__BEGIN_DECLSstruct 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);
};__END_DECLS#endif  // ANDROID_LED_INTERFACE_H

转载于:https://www.cnblogs.com/zhulinhaibao/p/6995461.html

第1课第4.4节_Android硬件访问服务编写HAL代码相关推荐

  1. 第12课第2.2节 字符设备驱动程序之LED驱动程序_测试改进

    第12课第2.2节 字符设备驱动程序之LED驱动程序_测试改进 //仅用flash上的根文件系统启动后,手工MOUNT NFS mount -t nfs -o nolock,vers=2 192.16 ...

  2. 初一第一节计算机课,初中信息技术第一节课-常规教育ppt课件

    <初中信息技术第一节课-常规教育ppt课件>由会员分享,可在线阅读,更多相关<初中信息技术第一节课-常规教育ppt课件(17页珍藏版)>请在人人文库网上搜索. 1.欢迎走进信息 ...

  3. matlab 排课,Matlab 遗传算法解决智能排课算法 一天四节课,上午两节,下午两

    Matlab 遗传算法解决智能排课算法 一天四节课,上午两节,下午两 Matlab 遗传算法解决智能排课算法 一天四节课,上午两节,下午两节,同一门课不能相邻,特殊课程不能相邻(语文和英语,数学和科学 ...

  4. 供销合作社对话中国农民丰收节交易会 谋定为农服务主业

    供销合作社对话中国农民丰收节交易会 谋定为农服务主业 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 经信研究 国研智库 国情讲坛 哲商对话 万权采编:"2020年是供销合作社发展史上具 ...

  5. .NET Core开发实战(第16课:选项数据热更新:让服务感知配置的变化)--学习笔记...

    16 | 选项数据热更新:让服务感知配置的变化 选项框架还有两个关键类型: 1.IOptionsMonitor 2.IOptionsSnapshot 场景: 1.范围作用域类型使用 IOptinsSn ...

  6. 《Spark商业案例与性能调优实战100课》第17课:商业案例之NBA篮球运动员大数据分析系统代码实战

    <<<Spark商业案例与性能调优实战100课>第17课:商业案例之NBA篮球运动员大数据分析系统代码实战

  7. 第4课第4节_Android灯光系统_源码分析_电池灯

    电池的监听器: Android灯光系统的源码分析与使用 4. 电池灯 a. batteryPropertiesRegistrar.registerListener(new BatteryListene ...

  8. cdata节 赋值变量_JS原生练习题:第二课第5~12节

    第五节:函数传参,改变Div任意属性的值 函数传参,改变Div任意属性的值 属性名: 属性值: 确定 重置 在上方输入"属性名"和"属性值",点击确认按钮查看效 ...

  9. 深度学习用于医学预后-第二课第四周1-4节-使用线性和基于树的模型构建风险评估模型

    今天起进入到第四周课程的学习,使用线性和基于树的模型构建风险评估模型 风险分数 本周,你将学习建立和评估生存预测模型的策略,这些模型将使你能够比较个体患者的风险.您将学习两个这样的模型:Cox比例风险 ...

最新文章

  1. CVPR 2020 论文大盘点-全景分割与视频目标分割篇
  2. animate inater插件_C4D R20插件下载 旧版插件C4D R20桥接插件INSYDIUMS Plug-In Bridge Cinema 4D R20 免费版 下载-脚本之家...
  3. 当 HTTP 连接池遇上 KeepAlive 时
  4. ML之FE:基于自定义数据集(银行客户信息贷款和赔偿)对比实现特征衍生(手动设计新特征、利用featuretools工具实现自动特征生成)
  5. Tex2Word vs Word2Tex
  6. Unix Shell 数学计算命令
  7. 国际免费版 新冠疫情数据分析APP正式发布!
  8. 在ASP.NET WebAPI 中使用缓存【Redis】
  9. Android Studio出现Error:No service of type Factory available in ProjectScopeServices.
  10. mac book 专用最新款win10镜像
  11. MySQL学生信息管理系统
  12. 【机器学习】分类性能度量指标 : ROC曲线、AUC值、正确率、召回率、敏感度、特异度
  13. VSCode折叠所有区域代码快捷键
  14. VB编程:UCase转大写,LCase转小写-4
  15. 小程序源码:uni-app云开发的网盘助手-多玩法安装简单
  16. Tekla图纸二次开发课程
  17. win10系统双屏显示
  18. windows7 系统下载
  19. Python环境搭建指南
  20. 常见机器学习模型适用场景及优缺点

热门文章

  1. usaco Drainage Ditches(网络流dinic模板)
  2. python nltk book_NLTK学习笔记(一):语言处理和Python
  3. python注入_python的常见命令注入威胁
  4. android检测蓝牙设备连接不上,Android检查设备连接状态
  5. python数据库框架_Python数据库及ORM框架对比选择
  6. mysql 协议说明_MySQL认证协议_MySQL
  7. 油品调和计算软件_燕山石化汽油在线调和系统完成升级改造
  8. efishell无法开机shell_电脑出现EFIshellversion解决方法W1048/海尔青春小蓝
  9. 将字符型的数字转化为整型
  10. 计算机类英语怎么学,计算机专业英语教程视频