iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、陀螺仪、CAN总线、RS485总线、500万摄像头等模块,稳定运行Android 4.0.3/Android 4.4操作,系统通用Linux-3.0.15+Qt操作系统(QT支持5.7版本),Ubuntu版本:12.04,接口智能分配 方便好用。
【交流群2】258811263(获取开源资料)
【迅为B站】北京迅为电子的个人空间-北京迅为电子个人主页-哔哩哔哩视频
第十一部分 Android系统开发
第一百章 Android应用开发环境搭建
迅为电子提供 Android Eclipse 和 Android Studio 两个版本的 Android 应用源码,在18.1 小节介绍如何搭建 Android Eclipse 的开发环境,在 18.2 小节中介绍如何搭建 Android Studio 的开发环境。在本章其它小节中,请注意其中内容介绍的是 Android Studio 还是Android Eclipse 部分,两种方式,学习一种就可以。
作者这里建议新用户使用 Android Studio 开发环境,Android Studio 更加简单,更加便捷,更实用,更智能。
100.1 搭建Android Eclipse开发环境
在不同的平台下,Android 应用的开发环境,需要的软件各不相同,但是安装方法和使用方法都是一样。这里给大家详细介绍在 Win7-64 位操作系统下搭建开发环境的方法,其它平台可以参考下面的搭建方法。
这里需要注意的是,这里介绍的是用户如何下载最新的编译环境。
在网盘中我们有提供了一套编译环境,用户可以从网盘“iTOP4412开发板资料汇总(不含光盘内容)\iTOP-4412 开发板搭建编译环境所需要的工具包以及补丁包\05-Android Eclipse 上层应用程序编译时需要的工具软件及插件” 目录中直接下载。
"JDK_Win7-64"中有更新后的 Android4.0.3 的工具,将 ADT 解压后得到的文件覆盖就可以直接编译我们提供的例程。
100.1.1 下载JDK
要下载 Oracle 公司的 JDK 可以百度“JDK”进入 Oracle 公司的 JDK 下载页面,然后选择自己电脑系统的对应版本即可。一般来说,下载网址如下:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
打开网页,如下图所示,单击红色框的 JDK 下载链接。
如下图所示,选择红色方框中的圆圈,接受下载协议。
根据平台选择 jdk 的下载,这里使用的是 Win7-64 位,所以选择如下图所示的版本。目前使用的版本是 jdk1.8。
100.1.2 安装JDK
下载完成后,双击下载的可执行文件“jdk-8u25-windows-x64.exe”,根据向导完成安装即可,安装路径选择默认就可以,否则后面的环境变量需要用户根据情况修改。
安装完成后,下面来修改一下环境变量。
右键单击“我的电脑”,进入“属性”,如下图,单击“高级系统设置”。
如下图,打开环境变量设置窗口。
在后面添加环境变量“C:\Program Files\Java\jdk1.8.0_25\;”,注意后面要带分号。
点击“确定”完成 JDK 环境变量的设置。
如下图,是 JDK 安装的默认路径,如果用户 JDK 安装的路径不一样,用户需要稍微改一下路径。
环境变量设置完成后,接下来测试一下。
进入 DOS 命令行,如下图,输入命令“#java -version”,出现 java 版本,则表明环境变量设置正确。
100.1.3 安装ADT集成开发环境
Android SDK(Software Development Kit)提供了开发 Android 应用程序所需的 API 库和构建、测试和调试 Android 应用程序所需的开发工具。
下载地址为:http://developer.android.com/sdk/
如下图所示,进入下载页面,
接受下载协议,选择 64 位,开始下载。这里根据用户实际情况来选择是 32 位还是 64 位。
下载完成后,解压得到“adt-bundle-windows-x86_64-20140702”文件夹(Google 更新后文件夹的后缀会改变,不过更新的工具都是向下兼容的),里面已经包含了 eclipse 和SDK Manager.exe。
100.1.4 下载SDK
进入解压的文件夹,如下图,打开可执行程序“SDK Manager.exe”。
打开后,“SDK Manager.exe”程序如下图所示。
iTOP-4412 的 Android 版本是 4.0.3,所以需要下载 Android4.0.3 的 SDK。如下图,选择 Android4.0.3 的工具。
单击按钮“Install 2 packages”,弹出下图所示窗口。
如下图,接受下载协议,单击按钮“Install”,开始下载。
如下图所示,开始下载。
如下图所示,安装完成。
100.1.5 ADT集成开发环境
前面我们已经配置好了 java 的开发环境,安装了开发 Android 的 IDE,下载安装了Android SDK。为了使得 Android 应用的创建,运行和调试更加方便快捷,Android 的开发团队专门针对 Eclipse IDE 定制了 Android Development Tools(ADT)。
下面我们接着往下进行:
进入“adt-bundle-windows-x86_64-20140702\ eclipse”打开“eclipse.exe”应用程序。
如下图所示,设置 Workspace 的路径。设置好之后点击 OK。如果选择默认也可以,用户根据实际情况设定。
进入 Eclipse 的主界面。
Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。但是 Android 应用程序的开发环境(ADT——Android Developer Tools)都是以 Eclipse 为骨架建立的,所以 Eclipse 在这里可以代指 ADT。
100.1.6 创建Android模拟器
在 Eclipse 中,单击“Windows”菜单,选择“Android Virtual Device Manager”启动模拟器管理插件。然后如下图,单击“Create……”。
如下图所示,设置参数,单击“OK”,完成。
如下图,选择 Android4.0.3,单击“Start”启动。
如下图,单击“Launch”,启动模拟器。
如下图,启动中,可能需要 1 到 5 分钟。
如下图,模拟器启动完成。
100.1.7 创建Android应用程序helloworld
打开 Eclipse,选择菜单“File->New->Android Application Project”。
如下图,弹出对话框“New Android Project”。如下图所示设置。
单击上图中的按钮“Next”,后面的设置可以直接默认,直到出现如下图所示界面,单击“Finish”,回到 Eclipse 界面。
回到 Eclipse 界面,如下图所示。
100.1.8 在模拟器上运行helloworld
接上一小节,如下图,在“Package Explorer”中选中 helloworld 工程。
选择 Eclipse 菜单“Run->Run As->Android Application”,运行 helloworld 程序。Eclipse 会自动启动 Android 的模拟器,这个过程和用户机器的配置有关,一般 1-5 分钟之间。启动后,如下图所示,给模拟器屏幕解锁。
如下图所示,helloworld 程序在模拟器上运行起来了。
100.1.9 在开发板上调试helloworld
安装 ADB 驱动
在开发板上调试 Android 应用,首先要安装 ADB 驱动。
用户可以参考 5.3 小节安装,在使用 fastboot 烧写镜像的时候已经安装过 ADB 驱动了。
·安装完成后,打开文件夹中“USB_fastboot_tool\platform-tools”的命令行cmd.exe,如下图所示,输入命令“adb”,然后回车。这里集成了 adb 命令,不需要用户去设置环境变量。
测试 ADB 驱动
启动 iTOP-4412 开发板,然后使用 OTG 先和电脑的 USB 接口相连接。在命令行中,输入命令“#adb shell”。 如下图所示,表明 ADB 已经连接成功。
这里需要注意的是,ADB 全称是“Android Debug Bridge”,它是安卓的调试的一个程序。无论使用迅为电子提供的驱动,还是通过上面小节的程序“SDK Manager.exe”来安装驱动,本质上也是一个 USB,只是这个 USB 接口比较小,我们把它叫做 OTG 接口。OTG 接口,这是硬件上的一个称呼。
因为它需要在命令行中输入命令,有时候在用到这个接口的时候,也叫它 Windows 命令行。由于在 Windows 下的命令行是从 DOS 系统延续而来,所以也可以叫 DOS 命令行。我们这里所用的 ADB 只是增加了“adb.exe”这个可执行程序,有了这个程序,我们就可以输入 ADB 命令。
通过 OTG 接口调试 helloworld 应用
开启 iTOP-4412 开发板,使用 OTG 线连接电脑。打开 Eclipse,打开 helloworld 工程。
在界面的左侧,右击 helloworld 工程,点 Properties,弹出如下图所示的“Properties for helloworld”窗口。
如上图,选择“Run/Debug Settings”以及"hellowrold",单击“Edit…”。弹出如下图所示窗口,单击“Target”。
如下图所示,先选择红色箭头指的“Android4.0.3”,然后选择“Always prompt to pick device”。
单击 OK 保存退出。
选中 helloworld 工程,选择菜单“Run->Run”,弹出如下图所示的“Android Device Chooser”设备选择框。
如上图所示,选择实体设备,也就是 iTOP-4412 开发板,选择后单击按钮“OK”。稍等一会,helloworld应用程序就在开发板上运行起来了。
100.2 Android Eclipse导入应用程序
用户可以在网盘“TOP-4412 开发板系统源码及镜像(其他)\Android Eclipse 版本测试源码”目录中下载“iTOP-4412-Android4.0- ledtest 小灯_V1.0.rar”工程文件。
本节以 Led 为例详细讲解如何使用迅为电子提供的例程。
100.2.1 导入 Led 应用程序工程
本小节给大家详细讲解如何导入 Android 应用的工程文件。先解压“ledtest.zip”压缩包。如下图所示,解压出 ledtest 文件夹
然后,如下图所示,打开 Eclipse,单击“File”菜单,选择“Import……”。
如上图所示,选择弹出窗口“Import”中的“General/Existing Project into Workspace”,单击按钮“Next”。弹出如下图所示界面。
如上图,单击红色框中的按钮“Browse”。如下图,选上解压 ledtest 出的文件夹,单击确定。
如下图所示,返回“Import”弹窗,选上 ledtest 工程,然后单击按钮“Finish”。
如下图所示,导入成功
100.2.2 导入工程常见问题和解决办法
如果 Eclipse 使用不当,在导入工程的时候,可能会出现问题。本小节,介绍导入产生的原因以及解决办法。
从外部导入工程 workspace 目录的时候,在 workspace 目录中明明没有改工程,却提示“Some projects cannot be imported because they already exist in the workspace”。
导入工程失败的原因
出现上述错误的原因主要有两种,这里以已经导入的 ledtest 工程为例。
第一种情况,直接在 Eclipse 中删除工程,但是没有选择下图中方框的选项。这种删除方式导致工程文件删除了,但是在工作站中的文件夹“.metadata”中可能还有一些二进制残存的文件。就会导致 Eclipse 认为在工作站中,仍然有 ledtest 工程。
第一种情况,如下图所示,直接删除在工作站中的文件夹“.metadata”,原因同上。
解决办法
如下图所示,进入工作站中,删除文件夹“.metadata”,然后重新建立一个工作站,将新建工作站中的文件夹“.metadata”拷贝到该工作站文件夹中,重新导入。
100.2.3 在模拟器上调试
在调试前,需要建立虚拟设备,参考“18.2.3 创建 Android 模拟器”。Android4.0.3 的模拟器建好了之后,将默认模拟器设置为 Android4.0.3 版本。
打开 Eclipse,选上工程 ledtest,然后单击菜单“run→run”。
如下图,模拟器加载中。
如下图所示,加载完成。
如下图,将屏幕解锁之后,ledtest 会在模拟器上直接运行起来。
100.2.4 在开发板上调试
由于在开发板上 ledtest 应用已经默认安装了,所以在开发板上调试已安装应用的时候, 需要做一下处理才能够正常连接。
如 下 图 所 示 , 在 打 开 工 程 “ledtest”, 打 开 “bin”→“res”→ “AndroidMainifest.xml”文件。将 Package 的名称“com.topeet.ledtest”改为“com.topeet.ledDebug”。
如果想修改应用图标名称和应用程序窗口名称,则将下面的两个红色框中的参数修改成下图对应的名称。
如下图所示,应用程序窗体名称改变为 ledDebug。
如下图所示,应用程序 APK 名称改变为 ledDebug。
100.3 搭建Android Studio开发环境
在网盘中我们有提供了一套 Android Studio 的编译环境,用户可以从网盘“iTOP-4412 开发板搭建编译环境所需要的工具包以及补丁包\07-Android Studio 开发工具包以及插件”目录中直接下载。
该网盘目录如下图所示,注意其中的“更新后的 sdk”和“更新前的 sdk”和本节内容无关,不需要管,其它三个压缩包在本节中需要用到。
100.3.1 下载JDK
用户可以直接使用网盘“iTOP4412 开发板资料汇总(不含光盘内容)\iTOP-4412 开发板搭建编译环境所需要的工具包以及补丁包\07-Android Studio 开发工具包以及插件”路径下的“jdk-8u25-windows-x64.zip”的压缩文件。也可以按照下面的方法在网络中下载。
下载网址如下:
http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html?ssSourceSiteId=otncn
打开网页,如下图所示,单击红色框中的 JDK 下载链接。选择方框中的圆圈,接受下载协议。
根据平台选择 jdk 的下载,这里使用是 win7_64 位,所以选择如上图所示的版本。
100.3.2 安装JDK
下载完成后,双击下载的可执行文件“jdk-8u25-windows-x64.exe”,根据向导完成安装即可。安装路径可以自己修改为自己安装的路径,后面的环境变量也要需要用户根据自己安装的路径进行修改。
点击“下一步”。
接着设置安装路径(这里使用默认的安装路径)。
JDK 自动安装,直到出现如下图“Java 安装-目标文件夹”界面,这一步可以选择安装路径,作者这里选择默认安装路径。
如上图所示,接着点击“下一步”,JDK 会继续自动安装,大约 2-5 分钟。JDK 安装对话框显示安装成功,如下图。
如上图所示,点击关闭,JDK 安装完成。
安装完成后,可以在安装路径查看到如下图所示结果。
安装完成后,下面来修改一下环境变量。 右键点击“计算机”->“属性”,如下图。
在弹出的对话框中,单击“高级系统设置”。如下图。
选择属性“高级”->“环境变量”,打开环境变量设置窗口,如下图。
在环境变量窗口,“Administrator 的用户变量”属性中选择“PATH”变量,双击“PATH”,弹出“编辑用户变量”,在“变量值”参数中,添加环境变量“C:\Program Files\Java\jdk1.8.0_25;”(双引号中是要添加的内容!另外注意参数最后一定要带分号), 如下图所示。
环境变量设置完成之后,保存退出。
注意,这里是作者 JDK 的安装路径,如果用户 JDK 安装的路径不一样,用户需要改成对应的路径。
环境变量设置好之后,接下来测试一下。
进入 DOS 命令行,输入“java -version”命令,出现 java 版本,则表明环境变量设置正确。如下图。
由上图可知,环境变量设置正确。
100.3.3 安装Android Studio
下载 AndroidStudio
用户可以直接使用网盘“iTOP4412 开发板资料汇总(不含光盘内容)\iTOP-4412 开发板搭建编译环境所需要的工具包以及补丁包\07-Android Studio 开发工具包以及插件”路径下的“android-studio-ide-141.2422023-windows.zip”压缩文件。也可以按照下面的方法在网络中下载。
下载网址如下:
http://www.android-studio.org/index.php/download
打开网页如下图,根据平台选择对应版本下载。作者这里使用的是 Win7-64 位,所以选择如下图红色框中的版本。
安装 AndroidStudio
下载完成后,双击下载的可执行文件“android-studio-ide-141.2422023- windows.exe”,弹出如下图所示对话框。
如上图所示,多次点击“Next”默认配置,直到弹出如下对话框。
如上图所示,可以选择默认安装路径,如下图,作者把安装路径修改为“D:\PC\Android\Android Studio”。
接下来一直选择默认设置,直到如下图所示界面。单击“Install”进行安装。
安装完成界面,如下图所示。点击“Finish”完成安装。
安装完成。
100.3.4 下载SDK
提供好的 SDK 是在网盘“iTOP4412 开发板资料汇总(不含光盘内容)\iTOP-4412 开发板搭建编译环境所需要的工具包以及补丁包\07-Android Studio 开发工具包以及插件”路径下的“android-sdk_r24.4.1-windows.zip”压缩文件。也可以按照下面的方法在网络中进行下载。
下载网址:http://tools.android-studio.org/index.php/sdk/
打开网页如下图,根据平台选择对应版本下载。这里使用的是 Win7-64 位,所以选择如下图红色框中的版本。
下载好“android-sdk_r24.4.1-windows.zip”之后,解压压缩包(解压目录不可以是androidstudio 的安装目录)。
如下图所示作者解压路径是“D:\SDK”,接下来设置路径时会用到该路径。
接下来打开 AndroidStudio 软件。选择“File->Other Settings->Default Project Structure”选项。如下图。
修改后的路径为:“D:\SDK\android-sdk_r24.4.1-windows\android-sdk-windows”(android-sdk_r24.4.1-windows 是解压后生成的文件夹)下图所示。
单击“OK”,SDK 设置成功。
如果用户使用的工程出现如下图所示的报错,用户可以直接点击红色方框中的内容,按照提示,下载相应版本的 SDK 即可。
如果用户要下载适应自己系统版本的 SDK,则可以通过“Tools->Android->SDK Manager”选项,下载相应的版本的 SDK,如下图。
下载界面如下图所示。
100.3.5 创建Android模拟器
在 AndroidStudio 中,单击“Tools”->“Android”->“AVD Manager”选项。弹出如下对话框,点击红色方框中的按钮。
弹出如下所示对话框。选择红色方框中的选项,单击“Next”按钮。
选择红色方框中的选项,选择模拟器所需的 Android SDK 版本。
之后按照默认设置选择“Finish”按钮。
创建完成后,点击下图红色框中的运行按钮,运行模拟器。
耐心等待 3-5 分钟,模拟器启动后如下图所示。
创建模拟器过程中失败的话,注意看一下有没有相应的 sdk。以及创建模拟器的版本是否正确。
100.3.6 创建Android应用程序helloworld
运行 AndroidStudio 程序。如下图,选择创建一个新的 androidstudio 工程。
应用名称改为“helloworld”,项目保存路径修改为自己的保存路径。
连续点击下一步,直到如下界面,选择“Basic Activity”模板。
继续点击下一步直到出现如下界面。
点击“Finish”按钮,完成创建工程。
100.3.7 在模拟器上运行helloworld
选中“helloworld”工程文件,选择工具栏上的“Run”->“Run ‘app’”选项。
弹出如下图所示对话框,选择已运行的模拟器,点击“OK”按钮。
耐心等待 2-3 分钟,模拟器上显示运行“helloworld”程序,界面如下图所示。
100.3.8 在开发板上运行helloworld
开启 iTOP-4412 开发板(开发板上运行 android4.0.3 系统,并允许 usb 调试),使用OTG 线连接电脑。
打开 AndroidStudio,打开 helloworld 工程。选择工具栏上的“Run”->“Run ‘app’”选项。如下图。
弹出如下图所示对话框,选择已识别的 4412 设备。点击“OK”按钮。
稍等一会,helloworld 应用程序就在开发板上运行起来了。界面如下图所示。
100.4 Android Studio导入应用程序
用户可以在网盘“iTOP4412 开发板资料汇总(不含光盘内容)\iTOP-4412 开发板系统源码及镜像(其他)\Android Studio 版本测试源码”路径下下载“iTOP-4412- AndroidStudio-ledtest 测试程序 v1.0.zip”工程文件。
100.4.1 导入 Led 应用程序工程
本小节给大家详细讲解如何导入 Android 应用的工程文件。
先解压“iTOP-4412-AndroidStudio-ledtest 测试程序 v1.0.zip”压缩包。如下图,解压出 ledtest 文件夹。
然后如下图所示,打开 AndroidStudio,单击“File->Open”
选择刚才解压出来的文件夹,选择工程下的 build.gradle,点击“ok”按钮。如下图。
导入后,界面如下图所示。
100.4.2 在模拟器上调试
在调试前,需要建立虚拟设备,参考“18.2.3 创建 Android 模拟器”章节建立Android 模拟器。
打开 AndroidStudio,选上工程 ledtest,然后单击“Run->Run ledtest”选项。如下图。
然后选择正在运行的模拟器。点击“OK”。
耐心等待 2-3 分钟,可以看见 ledtest 应用程序在模拟器上运行起来了,如下图所示。
100.4.3 在开发板上调试
打开 AndroidStudio,选上工程 ledtest,然后单击“Run->Run ledtest”选项。如下图。
然后选择已经识别的开发板设备。点击“OK”。如下图。
稍等一会,ledtest 应用程序就在开发板上运行起来了。界面如下图所示。
通过点击四个按钮,可以实现对开发板的控制。
100.5 JNI基础概念
Java 程序可以通过 JNI(Java Native Interface,Java 本地调用)访问本地的动态链接库,从而扩展其功能、保护关键代码、提高运行效率。
用户可以在网盘“iTOP-4412 开发板搭建编译环境所需要的工具包以及补丁包\05- Android Eclipse 上层应用程序编译时需要的工具软件及插件\编译安卓应用库的NDK_x86_linux”目录下载“android-ndk-r8b-linux-x86.tar.bz2”。
ledtest工程中的JNI
打开 ledtest 工程,如下图所示,在工程文件中,会发现 jni 文件夹中有 c 文件以及在libs 文件夹中有 libled.so 库文件。这个就是 JNI 的一个具体应用。
什么情况下需要使用JNI
Java 本机接口(Java Native Interface (JNI))是一个本机编程接口,它是 Java 软件开发工具箱(Java SoftwareDevelopment Kit (SDK))的一部分,JNI 它提供了若干的 API,实现了和 Java 和其他语言的通信(主要是 C&C++)。
JNI 允许 Java 代码使用以其它语言(譬如 C 和 C++)编写的代码和代码库。注意本使用手册以及例程都是 C 的代码和库。
Invocation API(JNI 的一部分)可以用来将 Java 虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用 Java 代码。
我们知道 Java 是一种平台无关性的语言,平台对于上层的 java 代码来说是透明的,所以在 Android 上层应用中,大部分情况是不需要 JNI 的。但是在嵌入式 Android 开发中,以下两种情况肯定需要用到 JNI。
第一种情况,用户需要直接调用开发板底层中的驱动实现特定功能,那么怎么实现?因为底层 Kernel 中都是用 C 编写的。Java 是没有办法直接调用底层的,那么这种情况下就需要用到 JNI。
第二种情况,用户有现成的应用,但是都是基于 C 写的,那么想要尽快的完成任务,那么就需要用到 JNI。将 C 的程序移植到 JNI 中,然后制作好 API 接口,供上层 Java 的应用程序调用。
当然,还有其它很多情况下都需要用到 JNI,例如你有 C 写的算法,以及一些 C 的动态库想直接调用等等,但是那不是属于纯粹的嵌入式 Android 了,这里就不详细介绍了。
与JNI相关的文件
如下图所示,如果需要使用 JNI 功能和 Kernel 通信,那么就需要有以下几个文件:
jni.h→com.topeet.ledtest.h
jni.c→com.topeet.ledtest.c
lib.so→libled.so
Android.mk→Android.mk
100.6 Java程序调用JNI的方法和步骤
本节以 ledtest 为例,讲解 JNI 调用的关系,这样用户就可以仿写自己的 JNI。
Java 应用调用库
如下图所示,找到“MainActivity.java”文件,找到代码“System.loadLibrary("led");”这个代码就是包含了 led 库,也就是 C 的库。
然后,如下图所示,找到文件“led.java”,led 类中包含了 Open、Close 以及 Ioctl, 这里对应对底层字符驱动的打开、关闭以及输入数据的操作。
上面是属于本机文件的处理,下面介绍一下和 linux 相关的文件。
如下图所示,打开"com.topeet.ledtest_led.h"文件。首先需要包含 jni.h 文件,实现 JNI 功能必须包含这个头文件。然后就是大的红色方框中,这里需要通知 Java 程序,这里是 C 的程序,用户可以模仿者写。然后就是上图中 Open、Close 以及 Ioctl 的定义,这里也是有特定的格式要求,用户如果想了解更多,可以看看 jni 头文件,里面对语法的规则都有定义。
最后给大家详细分析一下" com.topeet.ledtest_led.c"文件,如下图所示。
如下图所示,头文件"com_topeet_ledtest_led.h"上面已经分析过了,必须按照 jni.h 中定义的语法来写。包含了头文件“android/log.h”,这样我们在和开发板上调试的时候就可以使用 android 的 printk,方便调试。
再来介绍一下剩下的头文件,剩下的头文件全部是 linux 中标准的库文件,包括字符处理、报错、数学库以及调用设备节点需要的头文件等等。如果是做上层应用的用户,这些头文件简单的了解一下就可以。这里提醒一句,我们提供了很多 C 的应用例程,应用例程中的一些头文件也是实现对应的调用底层功能的,用户直接使用就可以了,不需要弄的太清楚。最后把自己需要的函数打包给上层调用就成了。
最后来看一下定义的三个 Open、Close 以及 Iotcl
先来分析一下 Open 函数,JNI 中的“Java_com_topeet_ledtest_led_Open”,主要功能是调用“/dev/leds”设备节点。
然后,就是 JNI 中的“Java_com_topeet_ledtest_led_Close”,主要功能是释放“/dev/leds”设备节点。
然后,就是 JNI 中的“Java_com_topeet_ledtest_led_Ioctl”,主要功能是向底层输入数据。
最后说明一下"/dev/leds "驱动源码在内核中的目录“iTop4412_Kernel_3.0/drivers/char/itop4412_leds.c”。
100.7 Android.mk文件
前面的一小节已经介绍了“com_topeet_ledtest_led.h”和“com_topeet_ledtest_led.c”,但是源码还需要编译成 lib.so 库才能使用。
编译成库就涉及到 Makefile 文件,本节给大家简单介绍一下 Android.mk 的编写。这里还是以 ledtest 为例,如下图。
下面是 Android.mk 文件中的代码
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := led
LOCAL_SRC_FILES := com_topeet_ledtest_led.c
LOCAL_LDLIBS += -llog
LOCAL_LDLIBS +=-lm
include $(BUILD_SHARED_LIBRARY)
下面我们来解析一下这几行代码。
1、LOCAL_PATH := $(call my-dir)
一个 Android.mk file 首先必须定义好 LOCAL_PATH 变量。它用于查找源文件。在这个例子中,宏函数‘my-dir’,由编译系统提供,用于返回当前路径(即包含 Android.mk file 文件的目录)。
2、include $(CLEAR_VARS)
CLEAR_VARS 由编译系统提供((可以在 android 安装目录下的/build/core/config.mk文件看到其定义,为 CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk)),指定让 GNU MAKEFILE 为你清除许多 LOCAL_XXX 变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES, 等等...),除 LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个 GNU MAKE 执行环境中,所有的变量都是全局的。
3、LOCAL_MODULE := led
LOCAL_MODULE 变量必须定义,以标识你在 Android.mk 文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。注意编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'led'的共享库模块,将会生成“libled.so”文件(也可以直接使用 libled 命名好)。
4、LOCAL_SRC_FILES := com_topeet_ledtest_led.c
LOCAL_SRC_FILES 变量必须包含将要编译打包进模块中的 C 或 C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。
5、LOCAL_LDLIBS += -llog
6、LOCAL_LDLIBS +=-lm
编译模块时要使用的附加的链接器选项。使用“-l”前缀传递指定库的名字是有用的。
LOCAL_LDLIBS := -llog 表示告诉链接器生成的模块要在加载时刻链接到“/system/lib/liblog.so”可查看 docs/STABLE-APIS.TXT 获取使用 NDK 发行版能链接到的开放的系统库列表。这里表示生成的是动态库。
7、include $(BUILD_SHARED_LIBRARY)
会生成依赖关系,当库不存在时会去编译这个库。
这里主要介绍的是基于 C 的 Makefile 文件的编写,如果用户使用的是 C++代码, Makefile 文件中的变量以及宏定义就会有所不同。
100.8 安装NDK编译器
这里给大家介绍一下如何生成基于 Linux 的 libxx.so 库。如下图所示,最后用户需要放在“libs/armeabi”中的库文件。
这里编译的方法是基于 Ubuntu12.04.2 的,首先需要安装 NDK 编译器。编译器在网盘“iTOP-4412 开发板搭建编译环境所需要的工具包以及补丁包\05-Android Eclipse 上层应用程序编译时需要的工具软件及插件\编译安卓应用库的 NDK_x86_linux”中。
将压缩包“android-ndk-r8b-linux-x86.tar.bz2”拷贝到 Ubuntu12.04.2 的“/usr/local/ndk”文件夹中,如果没有 ndk 文件夹,则需要用户自己建立一个 ndk 文件夹。如下图所示。
进入新建的 ndk 目录,使用命令“tar -vxf android-ndk-r8b-linux-x86.tar.bz2”将编译器解压到 ndk 目录中。如下图所示,解压完成。
如下图所示,使用“cd”命令,确认修改的是 root 用户的环境变量,然后使用命令“vim .bashrc”打开设置环境变量的文件。
进入文件“.bashrc”的最后一行。添加环境变量
export PATH=$PATH:/usr/local/ndk/android-ndk-r8b
如下图所示。
保存退出,然后使用命令“##source .bashrc”更新环境变量。
然后测试一下环境变量是否安装成功。输入“#ndk”,然后按“Tab”键,如下图所示, 则设置成功。
100.9 编译Android动态链接库
下面以 Android 应用程序的“ledtest”工程为例来讲解生成动态链接库的方法。如下图所示,工程“ledtest”中的 JNI 文件夹中有编译动态链接库需要用到的源代码以及编译脚本。
将工程中的“jni”文件夹拷贝到 Ubuntu12.04.2 的“/home/topeet/Android-app”目录中,如果没有“Android-app”目录,则可以新建一个,如下图所示。
如下图所示,进入 jni 目录,使用命令“ndk-build”编译。
返回上一级目录,使用命令“ls”查看,可以看到生成了文件夹“libs”和“obj”。
使用命令“#cd libs”进入“libs”目录,然后使用“#ls”命令查看,可以发现生成了文件夹“armeabi”,里面有库文件“libled.so”。
编译生成的“libs”和工程“ledtest”中的“libs”文件夹是对应的。
100.10 Eclipse报错解决方法
在使用 eclipse 打开从网络下载的 APP 源码,或者曾经正常编译使用项目源码时,偶尔会报错,如果确认源码没问题,但是仍然报错,这种情况多半是项目文件下的 libs 文件不全或者版本不对导致的问题。本文档介绍如何解决这个问题。
1库的更新
例如,作者解压了一个“helloworld.zip”,在 eclipse 中打开该工程,报错情况如图。
错误 1:ActionBarActivity:cannot be resolved to a type
解决:
1、删除 helloworld 工程 libs 目录下的 android-support-v4.jar 包。
2 、 将 E:\adt-bundle-windows- x86_64\sdk\extras\android\support\v7\appcompat\libs 目录下的 android-support- v4.jar 和 android-support-v7-appcompat.jar 拷贝到 helloworld 工程 libs 目录下。
如果原 libs 下面有这两个 jar 包,就会报错,选择 Yes To All 就行了。
最后会在 libs 下面出现这两个 jar 包。
3、点击 helloworld 工程 libs 目录下的 jar 包,右键,选择 Build Path ,然后选择 Add to Build Path,最后在 Referenced Libraries 下生成这两个 jar 包。
2重新导入缺失库
错 误 2: No resource found that matches the given name 'Theme.AppCompat.Light.DarkActionBar'.
解决:
1、右键 helloworld 工程,选择 import,然后选择 Android 下的 Existing Android Code Into Workspace,然后 Next。
2 、 在 弹 出 的 框 中 , 点 击 Browse, 把 目 录 E:\adt-bundle-windows- x86_64\sdk\extras\android\support\v7 下的 appcompat 加入,最后 Finish,此过程只需要执行一次,后面的工程直接从下一步开始。
3、右键 helloworld 工程,选择 Properties,选择左边的 Android,在右边的 Library 框中,选择已有的,点 Remove 删除,然后点 Add 把弹出的 android-support-v7- appcompat 加进去,最后点击 Apply 和 OK 错误就都没有了,可以正常运行。
一般源码没问题仍然报错的,按此方法就可以在 eclipse 中运行了。
100.11 Eclipse SDK在线升级
由于一些原因,android 的 sdk 没有办法通过 eclipse 默认的设置在线升级。
有两个解决办法,一个是修改主机的 host,具体可在网上搜索,读者可自行研究,第二个办法就是使用国内的镜像。本文档介绍如何设置国内镜像,然后通过国内镜像在线升级SDK。
首先打开 eclipse 点击按钮 Android SDK Manager,然后依次点开 Tools->Options, 弹出 Android SDK Manager - Settings,HTTP Proxy Server 处输入镜像地址,HTTP Proxy Port 处输入端口(由于谷歌的镜像现在在国内不能用了,有两个解决办法,一个是修改主机的 host,具体可在网上搜索,读者可自行研究,作者这里没有测试。第二个办法就是使用国内的镜像,现在有些国内的镜像也是很好用的,国内的镜像网上一搜也有很多,读者自行选择,作者这里主要推荐两个自己用的比较好的镜像地址和端口:(1)HTTP Proxy Server:mirrors.neusoft.edu.cn HTTP Proxy Port:80 (2)HTTP Proxy Server:sdk.gdgshanghai.com HTTP Proxy Port:8000)输入好镜像的地址和端口后勾选Use download cache 和 Force https://...sources to be fetched using http://...这两个框,然后点击 Clear Cache 和 Close 按钮,操作过程如图所示。
然后点击 Packages->Reload,经过一会后就会出现各版本的详细信息,选择目标版本,勾选目标版本结构下的 SDK Platform 和 ARM EABI v7a System Image,然后点击Install packages...等待片刻目标版本就下载好了,就可以创建该版本的虚拟机了。
如果没有弹出这些版本的话,可以先把这个页面关掉,重新打开就可以了,这里提供已经下载好的用于 eclipse 和 Android Studio 的 sdk,提供给用户使用。