在上一节基础上增加HAL层代码
1、完成IoctrlJ25_hal.c,填充主要结构体hw_module_t
static struct ioctrlj25_device ioctrlj25_dev = {
.common = {
.close = ioctrlj25_close,
},
.ioctrlj25_open = ioctrlj25_open,
.ioctrlj25 = ioctrlj25,
};
/*
//可以定义在h文件中
typedef struct ioctrlj25_device {
struct hw_device_t common;
int (*ioctrlj25_open)(struct ioctrlj25_device* dev);
int (*ioctrlj25)(struct ioctrlj25_device* dev,int which,int status);
} ioctrlj25_device_t;
*/
static int ioctrlj25_device_open(const struct hw_module_t* module, const char* id,
struct hw_device_t** device)
{
*device = &ioctrlj25_dev;
return 0;
}
/*===========================================================================*/
/* Default ioctrlj25 HW module interface definition */
/*===========================================================================*/
static struct hw_module_methods_t ioctrlj25_module_methods = {
.open = ioctrlj25_device_open,
};
/*参考
struct hw_module_t HAL_MODULE_INFO_SYM = {
.tag = HARDWARE_MODULE_TAG,
.module_api_version = VIBRATOR_API_VERSION,
.hal_api_version = HARDWARE_HAL_API_VERSION,
.id = VIBRATOR_HARDWARE_MODULE_ID,
.name = "Default vibrator HAL",
.author = "The Android Open Source Project",
.methods = &vibrator_module_methods,
};
*/
struct hw_module_t HAL_MODULE_INFO_SYM = {
.id = IOCTRLJ25_HARDWARE_MODULE_ID,
.methods = &ioctrlj25_module_methods,
};
完成ioctrlj25_open,和ioctrlj25,此处 ioctrlj25_open和ioctrlj25_device_open并不相同,后者时用来打开设备的。
2、修改com_android_server_IoctrlJ25Service.cpp
jint ioctrlj25open(JNIEnv *env, jobject cls)
{
jint err;
hw_module_t* module;
hw_device_t* device;
ALOGI("native ioctrlj25 open");
/* 1. hw_get_module*/
err = hw_get_module("ioctrlj25",(hw_module_t const**)&module);
if(err == 0){
/* 2. get device : module->methods->open*/
err = module->methods->open(module,NULL,&device);
if(err == 0){
ioctrlj25_dev = (ioctrlj25_device_t*)device;
/* 3. call ioctrlj25_open*/
return ioctrlj25_dev->ioctrlj25_open(ioctrlj25_dev);
}
}
ALOGI("native ioctrlj25 open fail");
return -1;
}
jint ioctrlj25ctl(JNIEnv *env, jobject cls, jint which, jint status)
{
ALOGI("native ioctrlj25 ctrl: id=%d status=%d\r\n",which,status);
return ioctrlj25_dev->ioctrlj25(ioctrlj25_dev,which,status);
}
其他基本不用修改。
3、
上传文件
frameworks/base/services/core/jni/com_android_server_IoctrlJ25Service.cpp
hardware/libhardware/include/hardware/IoctrlJ25_hal.h
hardware/libhardware/modules/IoctrlJ25/IoctrlJ25_hal.c
hardware/libhardware/modules/IoctrlJ25/Android.mk
Android.mk :
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ioctrlj25.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 := IoctrlJ25_hal.c
LOCAL_SHARED_LIBRARIES := liblog
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)
编译
mmm hardware/libhardware/modules/IoctrlJ25/
mmm frameworks/base/services/
打包编译,下载测试完成
这一节基本上就是这样了,如雷贯耳的HAL就这么简单,但具体生成的so动态库如何在实际项目中使用,还不知道,需要继续学习,也欢迎大家指点。