编译HAL层生成lib.so文件
来源:互联网 发布:淘宝可以找人代付吗 编辑:程序博客网 时间:2024/05/29 12:46
本文以编译LCD背光的库文件为例,生成的库文件为 lights.mini6410.so.
源文件的目录为:Android-2.3.4/device/samsung/crespo/liblight/ light.c Android.mk
light.c
/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */#define LOG_TAG "lights"#include <cutils/log.h>#include <stdint.h>#include <string.h>#include <errno.h>#include <fcntl.h>#include <pthread.h>#include <sys/ioctl.h>#include <sys/types.h>#include <hardware/lights.h>static pthread_once_t g_init = PTHREAD_ONCE_INIT;static pthread_mutex_t g_lock = PTHREAD_MUTEX_INITIALIZER;char const *const LCD_FILE = "/sys/class/backlight/pwm-backlight.0/brightness";static int write_int(char const *path, int value){int fd;static int already_warned;already_warned = 0;LOGV("write_int: path %s, value %d", path, value);fd = open(path, O_RDWR);if (fd >= 0) {char buffer[20];int bytes = sprintf(buffer, "%d\n", value);int amt = write(fd, buffer, bytes);close(fd);return amt == -1 ? -errno : 0;} else {if (already_warned == 0) {LOGE("write_int failed to open %s\n", path);already_warned = 1;}return -errno;}}static int rgb_to_brightness(struct light_state_t const *state){int color = state->color & 0x00ffffff;return ((77*((color>>16) & 0x00ff))+ (150*((color>>8) & 0x00ff)) + (29*(color & 0x00ff))) >> 8;}static int set_light_backlight(struct light_device_t *dev,struct light_state_t const *state){int err = 0;int brightness = rgb_to_brightness(state);pthread_mutex_lock(&g_lock);err = write_int(LCD_FILE, brightness);pthread_mutex_unlock(&g_lock);return err;}static int close_lights(struct light_device_t *dev){LOGV("close_light is called");if (dev)free(dev);return 0;}static int open_lights(const struct hw_module_t *module, char const *name,struct hw_device_t **device){int (*set_light)(struct light_device_t *dev,struct light_state_t const *state);LOGV("open_lights: open with %s", name);if (0 == strcmp(LIGHT_ID_BACKLIGHT, name))set_light = set_light_backlight;elsereturn -EINVAL;pthread_mutex_init(&g_lock, NULL);struct light_device_t *dev = malloc(sizeof(struct light_device_t));memset(dev, 0, sizeof(*dev));dev->common.tag = HARDWARE_DEVICE_TAG;dev->common.version = 0;dev->common.module = (struct hw_module_t *)module;dev->common.close = (int (*)(struct hw_device_t *))close_lights;dev->set_light = set_light;*device = (struct hw_device_t *)dev;return 0;}static struct hw_module_methods_t lights_module_methods = {.open = open_lights,};const struct hw_module_t HAL_MODULE_INFO_SYM = {.tag = HARDWARE_MODULE_TAG,.version_major = 1,.version_minor = 0,.id = LIGHTS_HARDWARE_MODULE_ID,.name = "lights Module",.author = "Google, Inc.",.methods = &lights_module_methods,};
char const *const LCD_FILE = "/sys/class/backlight/pwm-backlight.0/brightness"; 是内核驱动加载后生成的节点文件,应用层传递brightness参数到节点,控制亮度。
Android.mk
# Copyright (C) 2008 The Android Open Source Project## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.#ifneq ($(filter crespo crespo4g,$(TARGET_DEVICE)),)LOCAL_PATH:= $(call my-dir)# HAL module implemenation, not prelinked and stored in# hw/<COPYPIX_HARDWARE_MODULE_ID>.<ro.board.platform>.soinclude $(CLEAR_VARS)LOCAL_SRC_FILES := lights.cLOCAL_PRELINK_MODULE := falseLOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hwLOCAL_SHARED_LIBRARIES := liblogLOCAL_MODULE := lights.$(TARGET_BOARD_PLATFORM)#LOCAL_MODULE := lights.default#LOCAL_MODULE_TAGS := optionalLOCAL_MODULE_TAGS := enginclude $(BUILD_SHARED_LIBRARY)#endif
编译的时候遇到的问题:
1、编译之后没有生成lights.mini6410.so,原因是Android.mk中的这一句没有执行时判断不通过:ifneq ($(filter crespo crespo4g,$(TARGET_DEVICE)),),将其屏蔽就可以生成所需的文件了。
2、在out/target/product/mini6410/system/lib/目录下没有产生 lights.mini6410.so文件, 是由于LOCAL_MODULE_TAGS的值得原因, 当LOCAL_MODULE_TAGS := optional时,编译生成的库文件到了out/target/product/mini6410/symbols/system/lib/目录下;当LOCAL_MODULE_TAGS := eng 时,编译生成的库文件到了out/target/product/mini6410/system/lib/目录下,android2.3版本是这样,也许高级的版本不是这样,有待验证。
这有一篇参考文章:http://lengnuanyangguang.blog.163.com/blog/static/556764452012659239323/
Android.mk中的LOCAL_MODULE的名字的取法也是有讲究的,应该是对应的 xxx.xxx,前一个给功能,后一个为板子的名称或者default ,名字例如mini6410,,和out/target/product/mini6410一致。
- 编译HAL层生成lib.so文件
- NDK如何编译别人的.lib文件生成so
- 厂商HAL层库文件 xxx.xxx.so添加到源码中编译到系统镜像中
- 安卓HAL层 so库文件加载原理
- scons 编译json生成 lib文件
- VC中编译生成lib文件
- vs2012编译c/c++生成lib文件
- VC6.0 编译Json生成lib文件
- Cygwin编译生成So文件时出错
- Android--ndk编译生成.so文件
- Android Studio jni编译生成so文件
- android studio 编译C生成.so文件
- android studio编译c生成.so文件
- android studio 编译C生成.so文件
- 如何编译生成动态文件.so
- android ndk开发编译生成so文件
- AS编译c/c++生成so文件
- Android studio 生成 lib.so
- php get_class
- AT指令 发送手机短信
- 重新编译ApkTool
- 《Cocos2D-iPhone 游戏开发之路》第1节 下载&安装
- Android的按钮Button单击事件及监听器的实现方式
- 编译HAL层生成lib.so文件
- git远程分支的使用
- linux实习笔记(二)
- Microsoft Visual Studio 2012旗舰版(VS2012中文版下载)官方中文版
- git pull简介
- 子线程上的handler处理
- 语句:<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>是什么意思
- android,保存文件到sd卡和读取
- Linux用shell修改文件内容