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);
}
他只是一個封裝實際調用了[email protected] (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. 電池選項中的[email protected]是什麼
這是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虛擬機。