建立好framework 後 改寫JNI文件添加 hal

硬件控制 由HAL實現 而JNI來調用 hal 實現更好的保密性和 代碼修改性

android裏面對硬件的操作我們一般分爲兩個文件,一個是JNI文件(向上提供(註冊)本地函數,向下加載HAL文件並調用HAL文件的函數),一個是HAL文件(負責訪問驅動程序執行具體的硬件操作),這兩個文件都是C/C++語言寫的,所以JNI來加載HAL的實質就是怎麼使用dl_open來加載動態庫,android裏面對dlopen又做了一層封裝,我們使用的是“hw_get_module”這個函數(位於Hardware.c),函數實現過程如下

hw_get_module(“led”);//假設模塊名爲led,最終由這個模塊名轉爲文件名
代碼路徑:external\chromium_org\third_party\hwcplus\src\Hardware.c
在這裏插入圖片描述

調用過程:

模塊名(“led”)===>文件名(filename)
hw_get_module
----hw_get_module_by_class(“led”, NULL)
------name = “led”
---------property_get(根據名字獲得某個屬性值)
---------hw_module_exists(去目錄下判斷某個模塊是否存在)
加載
dlopen(filename)------>(android源目錄使用man dlopen查看使用方法)

https://blog.csdn.net/itdo_just/article/details/76187192
這位兄弟寫的很好

led_hal.c


#define LOG_TAG "LedHal"

#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;
	else
		return -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 = {
		.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 = {
    .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_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);
};


__END_DECLS

#endif  // ANDROID_LED_INTERFACE_H


Andriod.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := led.default

# HAL module implementation stored in
# hw/<VIBRATOR_HARDWARE_MODULE_ID>.default.so
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)


JNI: 重新上傳
frameworks/base/services/core/jni/com_android_server_LedService.cpp

HAL: led_hal.h
led_hal.c
把新文件上傳到服務器, 所在目錄:
hardware/libhardware/include/hardware/led_hal.h
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章