当前位置:首页 » 安卓系统 » androidled

androidled

发布时间: 2024-06-08 21:23:08

Ⅰ 一个双屏,一面是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;
}

热点内容
如保编程 发布:2024-11-26 19:29:58 浏览:812
我的世界手机版宝可梦生存多人服务器 发布:2024-11-26 19:29:52 浏览:730
卡盟服务器的象征什么意思 发布:2024-11-26 19:28:15 浏览:390
游戏平板安卓2000以下哪个好 发布:2024-11-26 19:21:12 浏览:547
php重命名文件夹 发布:2024-11-26 19:06:01 浏览:18
阿里云ecs服务器无法连接公网ip 发布:2024-11-26 19:01:32 浏览:43
java写helloworld 发布:2024-11-26 19:00:56 浏览:90
c语言递归排列 发布:2024-11-26 18:50:55 浏览:449
密码锁为什么不建议用南孚 发布:2024-11-26 18:45:00 浏览:153
荣耀20s安卓版本在哪里看 发布:2024-11-26 18:26:03 浏览:685