1. android hal 返回string
1、androidhal层是硬件抽象层,安卓把硬件的接口放在了kernel层,把相应的逻辑放在了HAL层,安卓的kernel层驱动,和HAL层的驱动简称系统驱动。
2、返回string的方法:通过函数的参数指定一个指针,然后在函数体内对指针赋值。如:chartemp[10],voidfunc(char*t){strcpy(t,"test")}func(temp)即可。
2. Android引入HAL的真正目的究竟是什么,HAL究竟有什么用
HAL 是为了链接driver与FRAMEWORK层的很好的东西,方便与app层开发人员,你无须知道driver层的信息,就可以做相关开发.
3. android中camera的hal模块怎么被调用
CameraService.cpp (frameworks\base\services\camera\libcameraservice)
中调用hw_get_mole
[cpp] view plain print?
void CameraService::onFirstRef()
{
BnCameraService::onFirstRef();
<span style="color: rgb(255, 0, 0);">if (hw_get_mole(CAMERA_HARDWARE_MODULE_ID,
(const hw_mole_t **)&mMole) < 0)</span> {
LOGE("Could not load camera HAL mole");
mNumberOfCameras = 0;
}
else {
mNumberOfCameras = mMole->get_number_of_cameras();
if (mNumberOfCameras > MAX_CAMERAS) {
LOGE("Number of cameras(%d) > MAX_CAMERAS(%d).",
mNumberOfCameras, MAX_CAMERAS);
mNumberOfCameras = MAX_CAMERAS;
}
for (int i = 0; i < mNumberOfCameras; i++) {
setCameraFree(i);
}
}
}
void CameraService::onFirstRef()
{
BnCameraService::onFirstRef();
if (hw_get_mole(CAMERA_HARDWARE_MODULE_ID,
(const hw_mole_t **)&mMole) < 0) {
LOGE("Could not load camera HAL mole");
mNumberOfCameras = 0;
}
else {
mNumberOfCameras = mMole->get_number_of_cameras();
if (mNumberOfCameras > MAX_CAMERAS) {
LOGE("Number of cameras(%d) > MAX_CAMERAS(%d).",
mNumberOfCameras, MAX_CAMERAS);
mNumberOfCameras = MAX_CAMERAS;
}
for (int i = 0; i < mNumberOfCameras; i++) {
setCameraFree(i);
}
}
}
看一下hw_get_mole是怎么回事
[cpp] view plain print?
int hw_get_mole(const char *id, const struct hw_mole_t **mole)
{
return <span style="color: rgb(255, 0, 0);">hw_get_mole_by_class(id, NULL, mole);
</span>}
int hw_get_mole(const char *id, const struct hw_mole_t **mole)
{
return hw_get_mole_by_class(id, NULL, mole);
}
他只是一个封装实际调用了hw_get_mole_by_class@Hardware.c (hardware\libhardware)
好在不长,看看吧
[cpp] view plain print?
int hw_get_mole_by_class(const char *class_id, const char *inst,
const struct hw_mole_t **mole)
{
int status;
int i;
const struct hw_mole_t *hmi = NULL;
<span style="color: rgb(255, 0, 0);"> char prop[PATH_MAX];//几个关键的数组
char path[PATH_MAX];//在下面起了重要
char name[PATH_MAX];//作用
</span>
if (inst)
snprintf(name, PATH_MAX, "%s.%s", class_id, inst);
else
strlcpy(name, class_id, PATH_MAX);//走这里
/*
* Here we rely on the fact that calling dlopen multiple times on
* the same .so will simply increment a refcount (and not load
* a new of the library).
* We also assume that dlopen() is thread-safe.
*/
/* Loop through the configuration variants looking for a mole */
for (i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {
if (i < HAL_VARIANT_KEYS_COUNT) {
if (property_get(variant_keys[i], prop, NULL) == 0)
<span style="color: rgb(255, 0, 0);">//在这里将prop的路径得到,分别从
"ro.hardware[qcom]"
"ro.proct.board"[7x27],
"ro.board.platform"[msm7627a],
"ro.arch",
"ro.hw_platform"[QRD_SKU3-1100]
这几个属性文件中获得硬件的信息
有些硬件信息的字符串会出现在编译后生成的.so名字中</span>
{
continue;
}
snprintf(path, sizeof(path), "%s/%s.%s.so",
HAL_LIBRARY_PATH2, name, prop);
if (access(path, R_OK) == 0) break;
snprintf(path, sizeof(path), "%s/%s.%s.so",
HAL_LIBRARY_PATH1, name, prop);<span style="color: rgb(255, 0, 0);">//走这里,在这里得到/system/lib/hw/camera.msm7627a.so
这样一个路径,这个库里有QualcommCamera.cpp,这是
camera模块HAL代码开始的地方</span>
if (access(path, R_OK) == 0) break;
} else {
snprintf(path, sizeof(path), "%s/%s.default.so",
HAL_LIBRARY_PATH1, name);
if (access(path, R_OK) == 0) break;
}
}
status = -ENOENT;
if (i < HAL_VARIANT_KEYS_COUNT+1) {
/* load the mole, if this fails, we're doomed, and we should not try
* to load a different variant. */
status = load(class_id, path, mole);<span style="color: rgb(255, 0, 0);">//这里关键,函数的三个参数可以串联成一句话:
到path(/system/lib/hw/camera.msm7627a.so)这个路径下找到一个id(camera)匹配的mole</span>
}
return status;
}
int hw_get_mole_by_class(const char *class_id, const char *inst,
const struct hw_mole_t **mole)
{
int status;
int i;
const struct hw_mole_t *hmi = NULL;
char prop[PATH_MAX];//几个关键的数组
char path[PATH_MAX];//在下面起了重要
char name[PATH_MAX];//作用
if (inst)
snprintf(name, PATH_MAX, "%s.%s", class_id, inst);
else
strlcpy(name, class_id, PATH_MAX);//走这里
/*
* Here we rely on the fact that calling dlopen multiple times on
* the same .so will simply increment a refcount (and not load
* a new of the library).
* We also assume that dlopen() is thread-safe.
*/
/* Loop through the configuration variants looking for a mole */
for (i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {
if (i < HAL_VARIANT_KEYS_COUNT) {
if (property_get(variant_keys[i], prop, NULL) == 0)
//在这里将prop的路径得到,分别从
"ro.hardware[qcom]"
"ro.proct.board"[7x27],
"ro.board.platform"[msm7627a],
"ro.arch",
"ro.hw_platform"[QRD_SKU3-1100]
这几个属性文件中获得硬件的信息
有些硬件信息的字符串会出现在编译后生成的.so名字中
{
continue;
}
snprintf(path, sizeof(path), "%s/%s.%s.so",
HAL_LIBRARY_PATH2, name, prop);
if (access(path, R_OK) == 0) break;
snprintf(path, sizeof(path), "%s/%s.%s.so",
HAL_LIBRARY_PATH1, name, prop);//走这里,在这里得到/system/lib/hw/camera.msm7627a.so
这样一个路径,这个库里有QualcommCamera.cpp,这是
camera模块HAL代码开始的地方
if (access(path, R_OK) == 0) break;
} else {
snprintf(path, sizeof(path), "%s/%s.default.so",
HAL_LIBRARY_PATH1, name);
if (access(path, R_OK) == 0) break;
}
}
status = -ENOENT;
if (i < HAL_VARIANT_KEYS_COUNT+1) {
/* load the mole, if this fails, we're doomed, and we should not try
* to load a different variant. */
status = load(class_id, path, mole);//这里关键,函数的三个参数可以串联成一句话:
到path(/system/lib/hw/camera.msm7627a.so)这个路径下找到一个id(camera)匹配的mole
}
return status;
}
再来看看load这个函数@hardware.c (hardware\libhardware)
[cpp] view plain print?
static int load(const char *id,
const char *path,
const struct hw_mole_t **pHmi)
{
int status;
void *handle;
struct hw_mole_t *hmi;
/*
* load the symbols resolving undefined symbols before
* dlopen returns. Since RTLD_GLOBAL is not or'd in with
* RTLD_NOW the external symbols will not be global
*/
handle = dlopen(path, RTLD_NOW);
if (handle == NULL) {
char const *err_str = dlerror();
LOGE("load: mole=%s\n%s", path, err_str?err_str:"unknown");
status = -EINVAL;
goto done;
}
<span style="color: rgb(255, 0, 0);"> /* Get the address of the struct hal_mole_info. */
const char *sym = HAL_MODULE_INFO_SYM_AS_STR;
hmi = (struct hw_mole_t *)dlsym(handle, sym);
</span> if (hmi == NULL) {
LOGE("load: couldn't find symbol %s", sym);
status = -EINVAL;
goto done;
}
/* Check that the id matches */
if (strcmp(id, hmi->id) != 0) {
LOGE("load: id=%s != hmi->id=%s", id, hmi->id);
status = -EINVAL;
goto done;
}
hmi->dso = handle;
/* success */
status = 0;
done:
if (status != 0) {
hmi = NULL;
if (handle != NULL) {
dlclose(handle);
handle = NULL;
}
} else {
LOGV("loaded HAL id=%s path=%s hmi=%p handle=%p",
id, path, *pHmi, handle);
}
*pHmi = hmi;
return status;
}
static int load(const char *id,
const char *path,
const struct hw_mole_t **pHmi)
{
int status;
void *handle;
struct hw_mole_t *hmi;
/*
* load the symbols resolving undefined symbols before
* dlopen returns. Since RTLD_GLOBAL is not or'd in with
* RTLD_NOW the external symbols will not be global
*/
handle = dlopen(path, RTLD_NOW);
if (handle == NULL) {
char const *err_str = dlerror();
LOGE("load: mole=%s\n%s", path, err_str?err_str:"unknown");
status = -EINVAL;
goto done;
}
/* Get the address of the struct hal_mole_info. */
const char *sym = HAL_MODULE_INFO_SYM_AS_STR;
hmi = (struct hw_mole_t *)dlsym(handle, sym);
if (hmi == NULL) {
LOGE("load: couldn't find symbol %s", sym);
status = -EINVAL;
goto done;
}
/* Check that the id matches */
if (strcmp(id, hmi->id) != 0) {
LOGE("load: id=%s != hmi->id=%s", id, hmi->id);
status = -EINVAL;
goto done;
}
hmi->dso = handle;
/* success */
status = 0;
done:
if (status != 0) {
hmi = NULL;
if (handle != NULL) {
dlclose(handle);
handle = NULL;
}
} else {
LOGV("loaded HAL id=%s path=%s hmi=%p handle=%p",
id, path, *pHmi, handle);
}
*pHmi = hmi;
return status;
}
在打开的.so(camera.msm7627a.so)中查找HMI符号的地址,并保存在hmi中。至此,.so中的hw_mole_t已经被成功获取,从而可以根
据它获取别的相关接口。
1)HAL通过hw_get_mole函数获取hw_mole_t
2)HAL通过hw_mole_t->methods->open获取hw_device_t指针,并在此open函数中初始化hw_device_t的包装结构中的
函数及hw_device_t中的close函数,如gralloc_device_open。
3)三个重要的数据结构:
a) struct hw_device_t: 表示硬件设备,存储了各种硬件设备的公共属性和方法
b)struct hw_mole_t: 可用hw_get_mole进行加载的mole
c)struct hw_mole_methods_t: 用于定义操作设备的方法,其中只定义了一个打开设备的方法open.
4. android 怎么选择audio hal
HAL 是为了链接driver与FRAMEWORK层的很好的东西,方便与app层开发人员,你无须知道driver层的信息,就可以做相关开发.
-
5. 怎样实现Android系统的HAL
HAL层有既定的编写规范,在规范下来写,然后添加自己想提供给framework层的接口.
可以参考一下 http://blog.csdn.net/luoshengyang/article/details/6567257 。
里面的博文从一到六,完整的描述的底层到应用层的调用,对于理解HAL有很大的帮助。
在android 4.4之前,这些接口调用不涉及到权限问题,android 5.0 之后涉及到权限问题,需要添加权限。
6. 电池选项中的android.hardware.audio@2.0-servce是什么
这是android音频hal层服务,你手机放歌 录音 调音量等等跟喇叭和mic有关的东西都是通过它来控制的。简单来说就是通过驱动来控制硬件的组件
7. android hal 怎样修改音频增益
我也遇到过。给以下资料你参考下:
提示hal.dll损坏或丢失,实际上该文件并不一定不存在,可以说,拷个文件回去system32里,根本是不可以解决的.出现这个错误的原因是boot.ini文件出错,导致引导不了机器从指定的路径启动,那样系统搜索其他的路径,而其他路径上是没有hal.dll文件的,就会提示这个错误.一般的解决办法是进入故障恢复控制台,用fixboot命令,如果这样修复不了boot.ini,就用bootcfg/add来重建boot.ini。
这个是由于C盘根目录下的boot.ini文件非法,导致默认从C:\Windows启动,但是又由于你的Windows XP没有安装在C盘,所以系统提示找不到HAL.DLL文件。启动因而失败。解决方法是重新编辑Boot.ini文件。
1)、使用Win9X启动盘启动,使用EDIT.EXE命令编辑这个文件。启动EDIT.EXE以后只要按照正确的格式输入Boot.ini文件的内容,保存为Boot.ini文件即可。
2)、使用COPY CON命令创建一个Boot.ini文件。在DOS下输入Copy Con C:\boot.ini以后回车。然后按照Boot.ini文件的格式输入,每输入一行敲一次回车键,当全部内容输入完毕以后,按CTRL+Z,屏幕上会看到^Z的提示。这个时候再敲一次回车,系统会提示1 file(s) copied.这就表示创建成功了。
3)、使用故障恢复控制台里面的bootcfg命令。
4)、在别的电脑上创建好以后,拷贝到受损电脑的C盘根目录上覆盖源文件即可。
还有个办法,你用个u盘从别个那里拷一个 hal.dll文件,然后插在你的电脑上,再用一张系统安装盘放进光驱。在第一选择里,选择修复,就可以进入doc里了。然后从a: b: 一直试下去,看到了u盘就要吧用
hal.dll c:\windows\system32\hal.dll 就可以了,
原理是在安装系统的时候,u盘也会被检测到,就可以用了。软盘也可以。但你应该不会有软驱
经过这样的修复后 如果问题仍在 那么可能是内存的故障
8. android的hal层用什么语言实现
Android的硬件抽象层,简单来说,就是对linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space),其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间。为什么要这样安排呢?把硬件抽象层和内核驱动整合在一起放在内核空间不可行吗?从技术实现的角度来看,是可以的,然而从商业的角度来看,把对硬件的支持逻辑都放在内核空间,可能会损害厂家的利益。我们知道,Linux内核源代码版权遵循GNU License,而Android源代码版权遵循Apache License,前者在发布产品时,必须公布源代码,而后者无须发布源代码。如果把对硬件支持的所有代码都放在Linux驱动层,那就意味着发布时要公开驱动程序的源代码,而公开源代码就意味着把硬件的相关参数和实现都公开了,在手机市场竞争激烈的今天,这对厂家来说,损害是非常大的。因此,Android才会想到把对硬件的支持分成硬件抽象层和内核驱动层,内核驱动层只提供简单的访问硬件逻辑,例如读写硬件寄存器的通道,至于从硬件中读到了什么值或者写了什么值到硬件中的逻辑,都放在硬件抽象层中去了,这样就可以把商业秘密隐藏起来了。也正是由于这个分层的原因,Android被踢出了Linux内核主线代码树中。大家想想,Android放在内核空间的驱动程序对硬件的支持是不完整的,把Linux内核移植到别的机器上去时,由于缺乏硬件抽象层的支持,硬件就完全不能用了,这也是为什么说Android是开放系统而不是开源系统的原因。
撇开这些争论,学习Android硬件抽象层,对理解整个A
9. android系统支持那些格式的音频文件
1、H.263:低码率视频编码标准,广泛应用于视频会议。
文件格式:
• 3GPP (.3gp)
• MPEG-4 (.mp4)
2、H.264 AVC:和MPEG2和MPEG4 ASP等压缩技术相比,在同等图像质量下,采用H.264技术压缩后的数据量只有MPEG2的1/8,MPEG4的1/3。提供了解决在不稳定网络环境下容易发生的丢包等错误的必要工具。从Android3.0+开始支持。在图像编码效率上,H.264算法最为领先,MPEG-4和H.263算法基本相同。
文件格式:
• 3GPP (.3gp)
• MPEG-4 (.mp4)
• MPEG-TS (.ts, AAC audio only, not seekable, Android 3.0+)
3、MPEG-4 SP:一种以矩形帧作为对象的编码形式,是从H.263、MPEG1和MPEG2继承而来的编码标准。
文件格式:3GPP (.3gp)
4、VP8:Google亲妈推出的,但压缩率比H.264差很多,Android2.3.3+。
文件格式:
• WebM(.webm)
• Matroska (.mkv, Android 4.0+) 注:开源,基于html5标准
10. android HAL与linux HAL有什么不同
嵌入式linux系统是在嵌入式设备中运行linux系统。 嵌入式android系统是在嵌入式设备中运行android系统。 其区别就是android系统和linux系统的区别。 android系统的底层是linux的内核,上面跑的是android的java虚拟机。