您好,登錄后才能下訂單哦!
兩個與hal有關的結構體 hw_module_t ,hw_device_t
一、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 <hardware/hardware.h> #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 <stdlib.h> #include "hal_led.h" #include <hardware/hardware.h> #include <cutils/log.h> /* 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)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。