重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
两个与hal有关的结构体 hw_module_t ,hw_device_t
十余年的麟游网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。全网营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整麟游建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联从事“麟游网站设计”,“麟游网站推广”以来,每个客户项目都认真落实执行。
一、jni和hal之间的关系
Tip:几种app,jni,hal,framework之间的关系框架
这篇文章用的框架是第二种框架的编写,他们的关系如下;
可以看出jni主要通过pModule和pdevice来获取hal中的变量来操作hal层
二、jni操作hal
获取hal层:1、jni获取hal层的module和device对象
操作hal层:2、jni操作hal层
jni操作hal完整代码参考[android底层]jni中获取自定义的类函数编写 来对比
三、hal的编写
编写hal注意点(注释部分)
1、HAL的.h文件的编写,自己的硬件自定义的modules和device的编写;以led为例子
2、HAL的.c文件的编写的步骤
编写hal的两个核心
一个结构体hw_module_t的结构体
一个hw_module_methods_t中的open函数;
hal编写步骤
第一步:hal一切从HMI开始
第二步:
第三步: 实现jni获取设备(hw_device_t)操作的函数
四、实现jni调用的释放(free)设备(hw_device_t)的函数,与第三步意图相反
完整代码
hal_led.h
#ifndef __HAL_LED_H__ #define __HAL_LED_H__ #include#define LED_MODULE_ID "myled_hal" //目标文件名称: libhal_jni_test.so struct led_hal_modules{ struct hw_module_t common;//必须这个名称(约定) }; struct led_hal_device{ struct hw_device_t common;//必须这个名称(约定) //下面是设备相关自定义函数 int (*open)(); int (*ledoff)(); int (*ledon)(); }; #endif
hal_led.c
#define LOG_TAG "myled_hal" #include#include "hal_led.h" #include #include /* 4、实现hw_device_t中的close函数来关闭设备, 与hw_module_methods_t中的open相反; ps:函数原型int (*close)(struct hw_device_t* device);*/ int mydev_close(struct hw_device_t* device){ struct led_hal_device* tmp; if(device != NULL){ tmp = (struct led_hal_device*)device; free(tmp); } return 0; } // 5、实现led_hal_device的自定义函数 int mydev_open(){ //open(/dev/leds1, flags); return 0; } int ledoff(){ //val = 1; //write(fd, &val, 4); return 0; } int ledon(){ //val =0; //write(fd, &val, 4); return 0; } // 3、通过open来分配并返回hw_device_t 给jni调用操作 int myled_hal_open(const struct hw_module_t* module, const char* id, struct hw_device_t** device){ // 3.1、分配一个hw_device_t空间 struct led_hal_device *mydev = (struct led_hal_device *)malloc(sizeof(struct led_hal_device *)); if(mydev == NULL){ LOGE("malloc error"); exit(1); } mydev->common.tag = HARDWARE_DEVICE_TAG; mydev->common.module = module; mydev->common.version = 1; //参照第4 步,hw_device_t中的close函数来关闭设备 mydev->common.close = mydev_close; //led_hal_device自定义函数 mydev->open = mydev_open; mydev->ledoff = ledoff; mydev->ledon = ledon; // 3.2、向jni传递device对象给jni调用操作 // 6、记得第三步的3.2步骤中 在open函数中向jni返回hw_device_t *device = ( struct hw_device_t*)mydev; return 0; } /* 2、本结构体主要作用使得jni通过open(.., .., struct hw_device_t** device)的device来获取hw_device_t 设备*/ static struct hw_module_methods_t myled_module_methods= { open:myled_hal_open//参照第3 步 }; // 1、结构体名称必须是这样HMI struct led_hal_modules HMI = { common:{ tag: HARDWARE_MODULE_TAG,//tag必须这个 version_major: 1,//主设备版本 version_minor: 0,//次设备的版本 id: LED_MODULE_ID,//.so动态库的名称(char *型) name: "Graphics Memory Allocator Module", author: "The Android Open Source Project", methods: &myled_module_methods,//hw_module_methods_t,参见第2 步 }, };
Android.mk
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw LOCAL_MODULE_TAGS := optional LOCAL_MODULE:= myled_hal.default LOCAL_SRC_FILES:= \ hal_led.c LOCAL_SHARED_LIBRARIES := \ libutils include $(BUILD_SHARED_LIBRARY)