androidled
Ⅰ 一個雙屏,一面是LED,怎麼控制下LED顯示內容,Android
現雙屏顯示的詳細操作步驟 一.連接好設備 在開機前,通過VGA介面連接好CRT顯示器,使用S端子線連接好顯卡和電視機,如下圖: 小知識:S端子線又稱為S-VIDEO連接線,S端子有4針、7針和9針的三種規格,其中4針的S端子線是可以使用在7針的S端子介面上的,9針的S端子介面一般具備VIVO功能或是HDTV功能(如下圖)。S端子連接線的長度最好控制在3米之內,最長不要超過5米,不然有可能出現電視機顯示畫面黑白或者是無信號輸出的狀況。需要主要的是:顯卡是沒有音頻信號輸出的,S端子介面的輸出是只有圖像而沒有聲音。另外如果使用S端子轉AV的轉接線或是轉接頭連接顯卡和電視機,則有可能出現電視機顯示畫面不正常或是無顯示的情況。 注意:S端子輸出介面支持設備的最大顯示解析度為1024 x768;DVI輸出介面支持設備的最大顯示解析度為1600 x1200;VGA輸出介面支持設備的最大顯示解析度為2048 x1536。 二.安裝顯卡驅動程序 打開您的顯示器和電視機,使用電視機遙控器的「TV/AV」按鈕把電視機切換到S-VIDEO頻道;使用電視機遙控器的「系統」按鈕調整電視機制式為PAL制式(部分電視機可能制式選擇按鈕和此處描述的按鈕不相同),打開計算機主機並且進入Windows系統後安... 現雙屏顯示的詳細操作步驟
一.連接好設備
在開機前,通過VGA介面連接好CRT顯示器,使用S端子線連接好顯卡和電視機,如下圖:
小知識:S端子線又稱為S-VIDEO連接線,S端子有4針、7針和9針的三種規格,其中4針的S端子線是可以使用在7針的S端子介面上的,9針的S端子介面一般具備VIVO功能或是HDTV功能(如下圖)。S端子連接線的長度最好控制在3米之內,最長不要超過5米,不然有可能出現電視機顯示畫面黑白或者是無信號輸出的狀況。需要主要的是:顯卡是沒有音頻信號輸出的,S端子介面的輸出是只有圖像而沒有聲音。另外如果使用S端子轉AV的轉接線或是轉接頭連接顯卡和電視機,則有可能出現電視機顯示畫面不正常或是無顯示的情況。
注意:S端子輸出介面支持設備的最大顯示解析度為1024 x768;DVI輸出介面支持設備的最大顯示解析度為1600 x1200;VGA輸出介面支持設備的最大顯示解析度為2048 x1536。
二.安櫻鬧慎裝顯卡驅動程序
打開您的顯示器和電視機,使用電視機遙控器的「TV/AV」按鈕把電視機切換到S-VIDEO頻道;使用電視機遙控器的「系統」按鈕調整電視機制式為PAL制式(部分電視機可能制式選擇按鈕和此處描述的按鈕不相同),打開計算機主機並且進入Windows系統後安裝顯示卡驅動程序,根據提示安裝好顯卡驅動程序,重新啟動計算機並且進入Windows系統。
溫馨提示:在開機BIOS檢測硬體和計算機重啟的時候,請您觀察您的顯示器和電視機是否都有信號輸出,如果顯示器或是電視機無信號輸出,請詳細檢查您的相關設備的連接線是否連接正常,S端子連接線的距離是否在3米之內,是否使用了AV轉接。
三.設置雙屏顯示
ATI系列顯卡雙屏顯示的具體設置方法
(在此以9550為例做說明,操作系統為Windows XP,顯卡驅動程序為5.3的催化劑驅動程序,ATI系列其他型號設置方法大致相同)
復制模式
使用復制模式的時候可以實現兩彎缺個顯示設備顯示相同的畫面
打開「我的電腦→控制面版→外觀和主題→顯示→設置→高級→顯示」,如下圖:
擴展模式
使用「擴展模式」的時候系統的任務欄是不會擴展到輔助顯示設備上的。而且在使用「擴展模式」的時候,如果在主顯示設備顯示畫面上最大化一個窗口的時候也只是在主顯示設備上面滿屏幕顯示,如果在輔助顯示設備顯示畫面上最大化一個窗口的時候也只是在輔助顯示設備上面滿屏幕顯示。
單擊上圖標注的紅色地方的紅色按鈕激活成綠色後應用,就可以開啟復制顯示模式了。(注意:根據您同時連接的不同介面的不同設備,激活的開關位置也不相同。)
左右擴展模式:左右擴展模式可以實現兩個顯示設備顯示不相同的畫面,類似於NVIDIA系列顯卡的「雙屏顯示」模式,擴展模式的具體設置方法:「我的電腦→控制面版→外觀和主題→顯示→設置」,在如下圖的對話框中選中顯示2,下圖中的選項「將Windows桌面擴脊敬展到該監視器上」前面的方框選中後應用設置。這個時候您的雙屏顯示模式就是「左右擴展模式」。
上下擴展模式:設置上下擴展模式的方法:「我的電腦→控制面版→外觀和主題→顯示→設置」,在出現的對話框中的2選中後使用滑鼠拖拽到下1的正下方即可,如下圖:
切換主從顯示設備
在「我的電腦→控制面版→外觀和主題→顯示→設置」,選中顯示2,選中「將Windows桌面擴展到該監視器上」後,再選中「使用該設備作為主監視器」後應用,就可以把輔助顯示設備切換成主顯示設備了(如下圖)。
此設置已經基本完成了雙屏顯示模式說明,如果您還有疑問請查看下面的「ATI系列顯卡設置雙屏顯示設置疑難解答」版塊。
ATI系列顯卡設置雙屏顯示設置疑難解答
1、為什麼通過S端子線連接好顯卡和電視機,打開計算機後電視機沒有信號輸出?
答:出現此現象,請您先注意以下幾點:
①.檢查S端子連接線的連接是否接觸良好而且連接正確;
②.您的電視機是否調整到了S-VIDEO頻道;
③.您的S端子連接線是否使用的是顯卡原配的S端子連接線,連接線的距離是否在3米之內;
④.您是否使用了轉接線或是轉接頭之類的設備。(使用此類設備有可能出現此現象,解決方法使用S端子線直連)
2、為什麼電視機顯示的畫面是黑白的?
答:出現此現象,請您注意以下幾點:
①.查S端子連接線是否接觸良好而且連接正確;
②.您的S端子連接線是否使用的是顯卡原配的S端子連接線,連接線的距離是否在3米之內;
③.您是否使用了轉接線或是轉接頭之類的設備。(使用此類設備有可能出現此現象,解決方法是使用S端子線直連);
④.打開「我的電腦→控制面版→外觀和主題→顯示→設置→高級→顯示→TV(T) →高級」,如右上圖的「S-Video清晰度」的值是否是「標准」;
⑤.「我的電腦→控制面版→外觀和主題→顯示→設置→高級→顯示→TV(T) →格式」,可以在如下圖TV屬性對話框中的 「電視格式選擇器」中調整電視機的制式來使其和您電視機的制式相統一。
3、為什麼在沒有安裝顯卡驅動程序的時候顯示器和電視機都有畫面顯示,但是安裝好顯卡驅動程序後進入Windows系統之後電視機(或顯示器)就沒有畫面顯示了?
答:出現此現象的原因:是因為顯卡在沒有安裝驅動程序之前的雙屏顯示功能是硬體控制的,安裝好顯卡的驅動程序後,在系統啟動的時候系統載入了顯卡的驅動程序之後的雙屏顯示功能就由顯卡的驅動程序在控制了。這個時候您需要按照上面講述到的設置方法來設置以後,電視機(或顯示器)才可以正常顯示畫面。
4、為什麼在我安裝好顯卡驅動程序後進入「我的電腦→控制面版→外觀和主題→顯示→設置→高級」選項後並沒有出現「顯示」之類的選項?
答:出現此現象的原因是顯卡的驅動程序沒有正確安裝成功或者是Windows系統的硬體加速功能被關閉了的原因,請您確認以下的兩種情況:
①.確認您的顯卡驅動程序是否正確安裝成功的具體方法:進入「我的電腦→控制面版→外觀和主題→顯示→設置→高級→適配器」,查看「適配器類型」和「適配器信息」是否是可用狀態,而且「顯示晶元類型」是否正確。否則,請重新安裝好顯卡驅動程序。
②.查看:「我的電腦→控制面版→外觀和主題→顯示→設置→高級→疑難解答」,確認「疑難解答」中的「硬體加速」功能是否是在「全」的狀態;如果不是在「全」的狀態,請把硬體加速調整到「全」的狀態。
③.如果上述的兩點均確認無異常的話,那有可能就是您的顯卡的驅動程序的控制面版沒有正常載入成功,您需要重新安裝一個集成控制面版的顯卡驅動程序,安裝的時候請務必注意安裝顯卡驅動程序的時候在如右上圖的對話中選擇「自定義安裝」,在如右上圖的對話框中一定要注意「ATI控制面版」此組件是選中狀態!然後根據提示選擇「下一步」 繼續安裝顯卡驅動程序。
小知識:在某些伺服器版的操作系統裡面,例如Windows Server 2003,其硬體加速功能默認是關閉的,您需要手動開啟系統的硬體加速功能到全的位置。
5、為什麼在進入Windows系統後,打開「我的電腦→控制面版→外觀和主題→顯示→設置→高級→顯示」的時候,發現另外的三個屏幕顯示的連接均都顯示
答:出現此現象的原因是顯卡沒有檢測到您電視機反饋的信號,請您注意檢測以下幾點:
①.檢查S端子連接線是否接觸良好而且連接正確;
②.您的S端子連接線是否使用的是顯卡原配的S端子連接線,連接線的距離是否在3米之內;
③.您是否使用了轉接線或是轉接頭之類的設備。(使用此類設備有可能出現此現象,解決方法使用S端子線直連)
④.請您嘗試更換另外版本號的顯卡驅動程序嘗試。
6、我按照上述的設置方法設置好了雙屏幕顯示模式了,而且兩個顯示設備顯示的畫面也已經完全相同,為什麼在播放影視文件的時候電視機(或顯示器)上面顯示的畫面是黑色的畫面(或是在播放器的影視框內顯示紅色的底色,或是靜止的畫面)?
如果我想實現在我的主顯示設備上處理文檔或是瀏覽網頁(或是運行3D游戲)的同時,在另外一個輔助顯示設備上播放影視文件提供給我家人朋友觀看,需要怎麼實現?
答:出現此現象的時候您需要:打開「我的電腦→控制面版→外觀和主題→顯示→設置→高級→覆蓋→劇院模式選項」,在如下圖的對話框的「覆蓋顯示模式」中選擇您需要的模式。
如果您想實現您的電視機全屏幕顯示正在播放的影視文件,顯示器上顯示的畫面沒有變化,您可以選擇「劇院模式」加「與視頻來源相同」或「全屏幕視頻」;此時兩個顯示屏幕顯示的畫面為:主顯示設備的屏幕顯示「我的電腦」、「回收站」等圖標,而還在窗口狀態下播放影視文件,輔助顯示設備的屏幕全屏幕的在播放您的影視文件。這個時候就可以實現您需要的在主顯示設備上面處理文檔的同時,輔助顯示設備顯示影視文件的全屏幕畫面;但是如果這個時候您需要是在主顯示設備上顯示運行的3D游戲的畫面的同時,您的輔助顯示設備上面顯示您需要播放的影視文件的畫面,就需要3D游戲和影視文件播放器均支持此顯示模式才可以實現;如果您想實現您的電視機和顯示器上顯示的畫面完全一樣,包括正在播放的影視文件播放窗口的畫面,您可以選擇「全部相同」。
7、為什麼電視機顯示的畫面會不如顯示器清晰?
答:電視機顯示的畫面不如顯示器清晰是因為電視機的解析度和刷新率沒有顯示器的解析度和刷新率高的原因。
8、為什麼按照上述的方法使用左右擴展的時候,我選擇了「將Windows左面擴展到該監視器上」的選項後,我的電視機沒有信號輸出了?
答:這個是因為您的S端子線的連接有問題;或者是您是使用的強制輸出信號的原因,在強制輸出信號的狀態下,是不可以使用擴展模式的。
NVIDIA系列顯卡雙屏顯示的具體設置方法
(在此以6600為例做說明,操作系統為Windows XP,顯卡驅動程序版本為76.44, NVIDIA系列其它型號具體設置方法大致相同)
打開「我的電腦→控制面版→外觀和主題→顯示→設置→高級→Geforce6600」,選擇「nView 顯示設置」這個選項,在出現的如下圖的對話框的「nView」中選擇「復制」模式後「應用」。
「nView 顯示設置」的說明
此時您也可以選擇其他的顯示模式,包括「水平跨越」、「垂直跨越」和「雙屏顯示」模式。
「水平跨越」可以實現兩個顯示設備(電視機和顯示器)分別顯示整個Windows桌面的左右兩個部分,包括系統任務欄;
「垂直跨越」可以實現兩個顯示設備(電視機和顯示器)分別顯示整個Windows桌面的上下兩個部分;
此時基本的設置項目基本完成。如果此時您還有疑問請您查看下面的「NVIDIA系列顯卡設置雙屏顯示設置疑難解答」版塊。
NVIDIA系列顯卡設置雙屏顯示設置疑難解答
1、為什麼通過S端子線連接好顯卡和電視機,打開計算機後電視機沒有信號輸出?
答:出現此現象,請您先注意以下幾點:
①.檢查S端子連接線的連接是否接觸良好而且連接正確;
②.您的電視機是否調整到了S-VIDEO頻道;
③.您的S端子連接線是否使用的是顯卡原配的S端子連接線,連接線的距離是否在3米之內;
④.您是否使用了轉接線或是轉接頭之類的設備。(使用此類設備有可能出現此現象,解決方法是使用S端子線直連)
2、為什麼電視機顯示的畫面是黑白的?
答:出現此現象,請您注意以下幾點:
①.S端子連接線的連接是否接觸良好而且連接正確;
②.您的S端子連接線是否使用的是顯卡原配的S端子連接線,連接線的距離是否在3米之內;
③.您是否使用了轉接線或是轉接頭之類的設備。(使用此類設備有可能出現此現象,解決方法是使用S端子線直連);
④.打開「我的電腦→控制面版→外觀和主題→顯示→設置→高級→Geforce6600→nView 顯示設置」,選中電視「1b」,單擊滑鼠右鍵,「選擇電視制式→高級…」,在如下圖的對話框中的「信號制式」選項中調整您的信號制式,使其和您的電視機設置的制式統一(可以嘗試把「信號制式」調整到「PAL-D」或「NTSC-J」嘗試。),然後把下圖的「視頻輸出制式」中分別選擇「復合視頻輸出」和「超級視頻輸出」嘗試。
3、為什麼在沒有安裝顯卡驅動程序的時候顯示器和電視機都有畫面顯示,但是安裝好顯卡驅動程序後進入Windows系統之後電視機(或顯示器)就沒有畫面顯示了?
答:出現此現象的原因:是因為顯卡在沒有安裝顯卡驅動程序之前的雙屏顯示功能是硬體控制的,安裝好驅動程序後,在系統啟動的時候系統載入了顯卡的驅動程序之後的雙屏顯示功能就由顯卡的驅動程序來控制了。這個時候您需要在顯卡的驅動程序的控制面版中設置好「nView顯示設置」後電視機(或顯示器)才可以正常顯示畫面。
4、為什麼在我安裝好顯卡驅動程序後進入「我的電腦→控制面版→外觀和主題→顯示→設置→高級」選項後並沒有出現「Geforce6600」的選項?
答:出現此現象的原因是:因為顯卡的驅動程序沒有正確安裝成功或者是Windows系統的硬體加速功能被關閉了的原因,請您確認以下的兩種情況:
①.您的顯卡驅動程序是否正確安裝成功,具體確認方法可以查看:進入「我的電腦→控制面版→外觀和主題→顯示→設置→高級→適配器」,查看「適配器類型」和「適配器信息」是否是可用狀態,而且「顯示晶元類型」是否正確,如果此部分信息不正確,請重新安裝好顯卡驅動程序。
②.查看:「我的電腦→控制面版→外觀和主題→顯示→設置→高級→疑難解答」,確認「疑難解答」中的「硬體加速」功能是否是在「全」的狀態;如果不是在「全」的狀態,請把硬體加速調整到「全」的狀態。
③.在有些操作系統中,可能已經不需要單獨安裝顯卡驅動程序就可以正確識別到顯卡了,但是卻沒有顯卡驅動的控制面版程序,這個時候您需要重新安裝獨立的顯卡驅動程序。
5、為什麼在進入Windows系統後,打開「我的電腦→控制面版→外觀和主題→顯示→設置→高級→Geforce6600」(根據您的顯卡不相同,此部分顯示的字元也有差異,例如5200會顯示GeforceFX5200)的時候,並沒有發現有「nView顯示設置」這樣的選項?
答:出現此現象的原因是因為顯卡沒有檢測到您的電視機反饋的信號,請您注意檢測以下幾點:
①.檢查S端子線連接是否接觸良好而且連接正確;
②.您的S端子連接線是否使用的是顯卡原配的S端子連接線,連接線的距離是否在3米之內;
③.您是否使用了轉接線或是轉接頭之類的設備。(使用此類設備有可能出現此現象,解決方法是使用S端子線直連)
④.請您嘗試更換另外版本號的顯卡驅動程序試試。
6、「nView顯示設置」中選擇了「復制」模式後,為什麼在播放影視文件的時候電視機(或顯示器)上面顯示的畫面是黑色的畫面(或是在播放器的影視框內顯示紅色的底色,或是靜止的畫面)?如果我想實現在我的主顯示設備上處理辦公文檔或是瀏覽網頁(或是運行3D游戲)的同時,在另外一個輔助顯示設備上播放影視文件提供給我家人朋友觀看,需要怎麼實現?
答:出現此現象的時候您需要在:打開「我的電腦→控制面版→外觀和主題→顯示→設置→高級→Geforce6600→全屏幕視頻」,如左圖在「全屏幕設備」中選擇「輔助顯示屏」。此時您還可以隨意切換全屏幕顯示影視文件畫面的顯示設備。
此時兩個顯示屏幕顯示的畫面為:主顯示設備的屏幕顯示「我的電腦」、「回收站」等圖標,而還在窗口狀態下播放影視文件,輔助顯示設備的屏幕全屏幕的在播放您的影視文件。這個時候就可以實現您需要的在主顯示設備上面處理文檔的同時輔助顯示設備顯示影視文件的全屏幕畫面,但是如果是需要在主顯示設備上面顯示正在運行的3D游戲的畫面的同時,輔助顯示設備上面顯示的是正在播放的影視文件的畫面,就需要此款3D游戲和影視文件播放器均支持此模式才可以實現。
輔助顯示設備的解析度說明:
復制模式下的電視機(輔助顯示設備)的解析度是會根據顯卡和電視機可以支持到的解析度來自動調整的,但是如果復制模式下的(主顯示設備)顯示器的設置的解析度已經超過了電視機(輔助顯示設備)的解析度的話,電視機是會自動虛擬出一個桌面來顯示畫面的,而電視機實際顯示的解析度則還是在顯卡和電視機自動調整的一個解析度的狀態下工作;如果您的輔助顯示設備是使用DVI介面的液晶顯示器,您在復制模式下設置好了主顯示設備的解析度,您設置的主顯示設備的解析度超過了液晶顯示器可以支持到的最大解析度或超過了1600 x1200的解析度的情況下,DVI介面的液晶顯示器是沒有信號輸出的。
第三部分:使用其他設備實現雙屏顯示功能
使用其他顯示設備實現雙屏顯示的設置方法和使用VGA介面的顯示器加S端子介面的電視機實現雙屏顯示功能的設置方法大致相同,只是設備的連接介面不相同。再不行的話你可以買多個視頻一分二! 展開
Ⅱ android 開發,打開打開led
前些日子 我做了個,但是不是通用的,我們是針對我們的系統定製的。
在Camera應用中,有個設置閃光燈的setFlashMode(int mode),android有個支持的 叫torch模式,但是我們的沒有實現,然後我讓驅動添加了個mode,這樣把camera程序初始化部分抄一遍,不需要startPreview就行,然後設置flashmode為手電筒mode,就可以,手電筒就亮了。
Ⅲ android中怎麼調用led燈 csdn
android的LED燈是通過通知來調用的,只是通知類的一個參數,具體大體實現方法如下:
final int ID_LED=19871103;
NotificationManager nm=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
Notification notification = new Notification();
notification.ledARGB = 0xFFFFFF; //這里是顏色,我們可以嘗試改變,理論上0xFF0000是紅色,0x00FF00是綠色
notification.ledOnMS = 100;
notification.ledOffMS = 100;
notification.flags = Notification.FLAG_SHOW_LIGHTS;
nm.notify(ID_LED, notification);
nm.cancel(ID_LED)。
Ⅳ 如何調用Android自帶的LED閃光燈
Android原生或基於原生系統(如CM OMNI 魔趣)在狀態欄按鈕里都會有手電筒按鈕,點擊就可以打開,再次點擊即可關閉; 像華為 小米的這樣的深度定製系統,有一個「手電筒」的軟體; 三星手機可能會在輔助功能里(就是5.0系統的「無障礙」); 實在找不到,就用相機軟體把閃光燈一直開著,就是手電筒。 希望我的回答對你有幫助!
Ⅳ 如何調用Android自帶的LED閃光燈
android的LED燈是通過通知來調用的,只是通知類的一個參數,具體大體實現方法如下:
final int ID_LED=19871103;
NotificationManager nm=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
Notification notification = new Notification();
notification.ledARGB = 0xFFFFFF; //這里是顏色,咱們可以嘗試改變,理論上0xFF0000是紅色,0x00FF00是綠色
notification.ledOnMS = 100;
notification.ledOffMS = 100;
notification.flags = Notification.FLAG_SHOW_LIGHTS;
nm.notify(ID_LED, notification);
nm.cancel(ID_LED);
Ⅵ 如何在qualcomm平台Android點亮一個LED工作流程分析
1.FW層代碼分析
BatteryService.java
public Led(Contextcontext, LightsManager lights) {
mBatteryLight =lights.getLight(LightsManager.LIGHT_ID_BATTERY);
mBatteryLowARGB =context.getResources().getInteger(
com.android.internal.R.integer.config_notificationsBatteryLowARGB);
mBatteryMediumARGB =context.getResources().getInteger(
com.android.internal.R.integer.config_);
mBatteryFullARGB =context.getResources().getInteger(
com.android.internal.R.integer.config_notificationsBatteryFullARGB);
mBatteryLedOn =context.getResources().getInteger(
com.android.internal.R.integer.config_notificationsBatteryLedOn);
mBatteryLedOff =context.getResources().getInteger(
com.android.internal.R.integer.config_notificationsBatteryLedOff);
}
public void updateLightsLocked() {
final int level =mBatteryProps.batteryLevel;
final int status =mBatteryProps.batteryStatus;
if (level <mLowBatteryWarningLevel) {
if (status ==BatteryManager.BATTERY_STATUS_CHARGING) {
// Solid red when battery is charging
mBatteryLight.setColor(mBatteryLowARGB);
} else {
// Flash red when batteryis low and not charging
mBatteryLight.setFlashing(mBatteryLowARGB, Light.LIGHT_FLASH_TIMED,
mBatteryLedOn,mBatteryLedOff);
}
} else if (status ==BatteryManager.BATTERY_STATUS_CHARGING
|| status ==BatteryManager.BATTERY_STATUS_FULL) {
if (status ==BatteryManager.BATTERY_STATUS_FULL || level >= 90) {
// Solid green when full orcharging and nearly full
mBatteryLight.setColor(mBatteryFullARGB);
} else {
if (isHvdcpPresent()) {
// Blinking orange ifHVDCP charger
mBatteryLight.setFlashing(mBatteryMediumARGB, Light.LIGHT_FLASH_TIMED,
mBatteryLedOn,mBatteryLedOn);
} else {
// Solid orange whencharging and halfway full
mBatteryLight.setColor(mBatteryMediumARGB);
}
}
} else {
// No lights if not chargingand not low
mBatteryLight.turnOff();
}
}
LightsService.java
public voidsetColor(int color) {
synchronized (this) {
setLightLocked(color, LIGHT_FLASH_NONE,0, 0, 0);
}
}
private void setLightLocked(int color, int mode, int onMS, int offMS,int brightnessMode) {
if (color != mColor || mode !=mMode || onMS != mOnMS || offMS != mOffMS) {
if (DEBUG) Slog.v("jyf","setLight #" + mId + ": color=#"
+Integer.toHexString(color));
mColor = color;
mMode = mode;
mOnMS = onMS;
mOffMS = offMS;
Trace.traceBegin(Trace.TRACE_TAG_POWER,"setLight(" + mId + ", 0x"
+Integer.toHexString(color) + ")");
try {
setLight_native(mNativePointer, mId, color, mode, onMS, offMS,brightnessMode);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_POWER);
}
}
2.JNI Java Native Interface
它可以使Java虛擬機內部運行的Java代碼能夠與其它的編程語言編寫的應用程序和庫進行交互操作。所以,在android中Java層調用底層的C/C++函數庫必須通過Java的JNI來實現。而該過程需要五個步驟:
a.編寫Java應用程序
在java程序中必須通過System.LoadLibrary(「library」);對庫文件進行載入並聲明用native聲明本地方法。
b.生成共享庫的頭文件:
javac FileName.java FileName.class
Javah Filename package_FileName.h
JNI頭文件里對應的函數的命名規范:
Java_packagename_classname_介面名。
c.編寫實現本地方法的C文件
新建package_FileName.c,並根據頭文件實現本地方法
d.編譯生成so庫
使用NDK-BUILD編譯步驟3)中的.c文件,生成.so的庫文件。並編寫相應的makefile文件。
include $(CLEAR_VARS) -清除之前的一些系統變數
LOCAL_MODULE - 編譯生成的目標對象
LOCAL_SRC_FILES - 編譯的源文件
LOCAL_C_INCLUDES - 需要包含的頭文件目錄
LOCAL_SHARED_LIBRARIES - 鏈接時需要的外部庫
LOCAL_PRELINK_MODULE - 是否需要prelink處理
include$(BUILD_SHARED_LIBRARY) - 指明要編譯成動態庫
3.Makefile
Android.mk是Android提供的一種makefile文件,用來指定諸如編譯生成so庫名、引用的頭文件目錄、需要編譯的.c/.cpp文件和.a靜態庫文件等。
Android.mk的用途:
一個android子項目中會存在一個或多個Android.mk文件
a、單一的Android.mk文件
直接參考NDK的sample目錄下的hello-jni項目,在這個項目中只有一個Android.mk文件
b、多個Android.mk文件
如果需要編譯的模塊比較多,我們可能會將對應的模塊放置在相應的目錄中,這樣,我們可以在每個目錄中定義對應的Android.mk文件(類似於上面的寫法),
最後,在根目錄放置一個Android.mk文件,內容如下:
include $(call all-subdir-makefiles)
只需要這一行就可以了,它的作用就是包含所有子目錄中的Android.mk文件
c、多個模塊共用一個Android.mk
這個文件允許你將源文件組織成模塊,這個模塊中含有:
-靜態庫(.a文件)
-動態庫(.so文件)
只有共享庫才能被安裝/復制到您的應用軟體(APK)包中
include $(BUILD_STATIC_LIBRARY),編譯出的是靜態庫
include $(BUILD_SHARED_LIBRARY),編譯出的是動態庫
4.自定義變數
以下是在 Android.mk中依賴或定義的變數列表,可以定義其他變數為自己使用,但是NDK編譯系統保留下列變數名:
-以 LOCAL_開頭的名字(例如 LOCAL_MODULE)
-以 PRIVATE_, NDK_ 或 APP_開頭的名字(內部使用)
-小寫名字(內部使用,例如『my-dir』)
如果為了方便在 Android.mk 中定義自己的變數,建議使用 MY_前綴,一個小例子:
MY_SOURCES := foo.c
ifneq ($(MY_CONFIG_BAR),)
MY_SOURCES += bar.c
endif
LOCAL_SRC_FILES += $(MY_SOURCES)
注意:『:=』是賦值的意思;'+='是追加的意思;『$』表示引用某變數的值。
5. GNU Make系統變數
這些 GNU Make變數在你的 Android.mk 文件解析之前,就由編譯系統定義好了。注意在某些情況下,NDK可能分析 Android.mk 幾次,每一次某些變數的定義會有不同.
a.CLEAR_VARS: 指向一個編譯腳本,幾乎所有未定義的 LOCAL_XXX 變數都在"Mole-description"節中列出。必須在開始一個新模塊之前包含這個腳本:include$(CLEAR_VARS),用於重置除LOCAL_PATH變數外的,所有LOCAL_XXX系列變數。
b.BUILD_SHARED_LIBRARY: 指向編譯腳本,根據所有的在 LOCAL_XXX 變數把列出的源代碼文件編譯成一個共享庫。
注意,必須至少在包含這個文件之前定義 LOCAL_MODULE 和 LOCAL_SRC_FILES。
c.BUILD_STATIC_LIBRARY: 一個 BUILD_SHARED_LIBRARY 變數用於編譯一個靜態庫。靜態庫不會復制到的APK包中,但是能夠用於編譯共享庫。
示例:include $(BUILD_STATIC_LIBRARY)
注意,這將會生成一個名為 lib$(LOCAL_MODULE).a 的文件
d.TARGET_ARCH: 目標 CPU平台的名字
e.TARGET_PLATFORM: Android.mk 解析的時候,目標 Android 平台的名字
f.TARGET_ARCH_ABI: 暫時只支持兩個 value,armeabi 和 armeabi-v7a。。
g.TARGET_ABI: 目標平台和 ABI 的組合。
6.模塊描述變數
下面的變數用於向編譯系統描述你的模塊。應該定義在'include $(CLEAR_VARS)'和'include $(BUILD_XXXXX)'之間。$(CLEAR_VARS)是一個腳本,清除所有這些變數。
a.LOCAL_PATH: 這個變數用於給出當前文件的路徑。
必須在 Android.mk 的開頭定義,可以這樣使用:LOCAL_PATH := $(call my-dir)
如當前目錄下有個文件夾名稱 src,則可以這樣寫 $(call src),那麼就會得到 src 目錄的完整路徑
這個變數不會被$(CLEAR_VARS)清除,因此每個 Android.mk 只需要定義一次(即使在一個文件中定義了幾個模塊的情況下)。
b.LOCAL_MODULE: 這是模塊的名字,它必須是唯一的,而且不能包含空格。
必須在包含任一的$(BUILD_XXXX)腳本之前定義它。模塊的名字決定了生成文件的名字。
c.LOCAL_SRC_FILES: 這是要編譯的源代碼文件列表。
只要列出要傳遞給編譯器的文件,因為編譯系統自動計算依賴。注意源代碼文件名稱都是相對於 LOCAL_PATH的,你可以使用路徑部分,例如:
LOCAL_SRC_FILES := foo.c toto/bar.c\
Hello.c
文件之間可以用空格或Tab鍵進行分割,換行請用"\"
如果是追加源代碼文件的話,請用LOCAL_SRC_FILES +=
注意:可以LOCAL_SRC_FILES := $(call all-subdir-java-files)這種形式來包含local_path目錄下的所有java文件。
e.LOCAL_C_INCLUDES: 可選變數,表示頭文件的搜索路徑。
默認的頭文件的搜索路徑是LOCAL_PATH目錄。
f.LOCAL_STATIC_LIBRARIES: 表示該模塊需要使用哪些靜態庫,以便在編譯時進行鏈接。
g.LOCAL_SHARED_LIBRARIES: 表示模塊在運行時要依賴的共享庫(動態庫),在鏈接時就需要,以便在生成文件時嵌入其相應的信息。
注意:它不會附加列出的模塊到編譯圖,也就是仍然需要在Application.mk 中把它們添加到程序要求的模塊中。
h.LOCAL_LDLIBS: 編譯模塊時要使用的附加的鏈接器選項。這對於使用『-l』前綴傳遞指定庫的名字是有用的。
例如,LOCAL_LDLIBS := -lz表示告訴鏈接器生成的模塊要在載入時刻鏈接到/system/lib/libz.so
可查看 docs/STABLE-APIS.TXT 獲取使用 NDK發行版能鏈接到的開放的系統庫列表。
i.LOCAL_MODULE_PATH 和 LOCAL_UNSTRIPPED_PATH
在 Android.mk 文件中, 還可以用LOCAL_MODULE_PATH 和LOCAL_UNSTRIPPED_PATH指定最後的目標安裝路徑.
不同的文件系統路徑用以下的宏進行選擇:
TARGET_ROOT_OUT:表示根文件系統。
TARGET_OUT:表示 system文件系統。
TARGET_OUT_DATA:表示 data文件系統。
用法如:LOCAL_MODULE_PATH :=$(TARGET_ROOT_OUT)
至於LOCAL_MODULE_PATH 和LOCAL_UNSTRIPPED_PATH的區別,暫時還不清楚。
j.LOCAL_JNI_SHARED_LIBRARIES:定義了要包含的so庫文件的名字,如果程序沒有採用jni,不需要LOCAL_JNI_SHARED_LIBRARIES := libxxx 這樣在編譯的時候,NDK自動會把這個libxxx打包進apk; 放在youapk/lib/目錄下
7.HAL HARDWORE ABSTRACTION LAYER
圖2 HAL框架結構
Lights.c
static int set_speaker_light_locked(struct light_device_t* dev,
struct light_state_t const* state)
{
int red, green, blue;
int blink;
int onMS, offMS;
unsigned int colorRGB;
ALOGE("liuyonglin set_speaker_light_locked enter test");
if(!dev) {
ALOGE("liuyonglin, light HAL dev is null");
return -1;
}
switch (state->flashMode) {
case LIGHT_FLASH_TIMED:
onMS = state->flashOnMS;
offMS = state->flashOffMS;
break;
case LIGHT_FLASH_NONE:
default:
onMS = 0;
offMS = 0;
break;
}
colorRGB = state->color;
ALOGE("liuyonglin set_speaker_light_locked mode %d, colorRGB=%08X, onMS=%d, offMS=%d\n",
state->flashMode, colorRGB, onMS, offMS);
red = (colorRGB >> 16) & 0xFF;
green = (colorRGB >> 8) & 0xFF;
blue = colorRGB & 0xFF;
if (onMS > 0 && offMS > 0) {
/*
* if ON time == OFF time
* use blink mode 2
* else
* use blink mode 1
*/
if (onMS == offMS)
blink = 2;
else
blink = 1;
} else {
blink = 0;
}
if (blink) {
if (red) {
if (write_int(RED_BLINK_FILE, blink))
write_int(RED_LED_FILE, 0);
}
if (green) {
if (write_int(GREEN_BLINK_FILE, blink))
write_int(GREEN_LED_FILE, 0);
}
if (blue) {
if (write_int(BLUE_BLINK_FILE, blink))
write_int(BLUE_LED_FILE, 0);
}
} else {
write_int(RED_LED_FILE, red);
write_int(GREEN_LED_FILE, green);
write_int(BLUE_LED_FILE, blue);
ALOGE("liuyonglin, write_int red green blue");
}
return 0;
}