真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

[android底層]hal硬件抽象層編寫

兩個(gè)與hal有關(guān)的結(jié)構(gòu)體 hw_module_t ,hw_device_t

十余年的麟游網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整麟游建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“麟游網(wǎng)站設(shè)計(jì)”,“麟游網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

[android底層] hal硬件抽象層編寫

一、jni和hal之間的關(guān)系

    Tip:幾種app,jni,hal,framework之間的關(guān)系框架

[android底層] hal硬件抽象層編寫    這篇文章用的框架是第二種框架的編寫,他們的關(guān)系如下;

    可以看出jni主要通過pModule和pdevice來獲取hal中的變量來操作hal層

[android底層] hal硬件抽象層編寫

二、jni操作hal

    獲取hal層:1、jni獲取hal層的module和device對象

[android底層] hal硬件抽象層編寫

    操作hal:2、jni操作hal層

[android底層] hal硬件抽象層編寫

[android底層] hal硬件抽象層編寫

[android底層] hal硬件抽象層編寫

jni操作hal完整代碼參考[android底層]jni中獲取自定義的類函數(shù)編寫    來對比

三、hal的編寫

編寫hal注意點(diǎn)(注釋部分)

1、HAL的.h文件的編寫,自己的硬件自定義的modules和device的編寫;以led為例子[android底層] hal硬件抽象層編寫

2、HAL的.c文件的編寫的步驟

編寫hal的兩個(gè)核心

    一個(gè)結(jié)構(gòu)體hw_module_t的結(jié)構(gòu)體

    [android底層] hal硬件抽象層編寫

    一個(gè)hw_module_methods_t中的open函數(shù);

[android底層] hal硬件抽象層編寫

hal編寫步驟

第一步:hal一切從HMI開始

[android底層] hal硬件抽象層編寫

第二步:

[android底層] hal硬件抽象層編寫

第三步: 實(shí)現(xiàn)jni獲取設(shè)備(hw_device_t)操作的函數(shù)

[android底層] hal硬件抽象層編寫

四、實(shí)現(xiàn)jni調(diào)用的釋放(free)設(shè)備(hw_device_t)的函數(shù),與第三步意圖相反

[android底層] hal硬件抽象層編寫

[android底層] hal硬件抽象層編寫

[android底層] hal硬件抽象層編寫


完整代碼

hal_led.h

#ifndef __HAL_LED_H__ 
#define __HAL_LED_H__ 
#include  
 
#define LED_MODULE_ID "myled_hal" //目標(biāo)文件名稱: libhal_jni_test.so 
struct led_hal_modules{ 
    struct hw_module_t common;//必須這個(gè)名稱(約定) 
}; 
struct led_hal_device{ 
    struct hw_device_t common;//必須這個(gè)名稱(約定) 
    //下面是設(shè)備相關(guān)自定義函數(shù) 
    int (*open)(); 
    int (*ledoff)(); 
    int (*ledon)(); 
}; 
 
#endif

hal_led.c

#define LOG_TAG "myled_hal" 
 
#include  
#include "hal_led.h" 
#include  
#include  
 
/* 4、實(shí)現(xiàn)hw_device_t中的close函數(shù)來關(guān)閉設(shè)備, 
與hw_module_methods_t中的open相反; 
    ps:函數(shù)原型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、實(shí)現(xiàn)led_hal_device的自定義函數(shù) 
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調(diào)用操作 
int myled_hal_open(const struct hw_module_t* module, const char* id, 
struct hw_device_t** device){ 
    // 3.1、分配一個(gè)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函數(shù)來關(guān)閉設(shè)備 
    mydev->common.close = mydev_close; 
 
    //led_hal_device自定義函數(shù) 
    mydev->open = mydev_open; 
    mydev->ledoff = ledoff; 
    mydev->ledon = ledon; 
 
    // 3.2、向jni傳遞device對象給jni調(diào)用操作
    // 6、記得第三步的3.2步驟中 在open函數(shù)中向jni返回hw_device_t 
    *device = ( struct hw_device_t*)mydev; 
 
    return 0; 
    } 
 
 
/*    2、本結(jié)構(gòu)體主要作用使得jni通過open(.., .., 
    struct hw_device_t** device)的device來獲取hw_device_t 設(shè)備*/ 
static struct hw_module_methods_t myled_module_methods= { 
    open:myled_hal_open//參照第3 步 
}; 
 
    // 1、結(jié)構(gòu)體名稱必須是這樣HMI 
struct led_hal_modules HMI = { 
        common:{ 
            tag: HARDWARE_MODULE_TAG,//tag必須這個(gè) 
            version_major: 1,//主設(shè)備版本 
            version_minor: 0,//次設(shè)備的版本 
            id: LED_MODULE_ID,//.so動(dòng)態(tài)庫的名稱(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)

當(dāng)前標(biāo)題:[android底層]hal硬件抽象層編寫
URL地址:http://weahome.cn/article/ggeijp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部