上一个教程 : 使用 Clojure 开发 OpenCV 简介
下一个教程 : OpenCV4Android SDK
原作者 | Vsevolod Glumov |
---|---|
兼容性 | OpenCV >= 3.0 |
警告
本教程已废弃。
本指南旨在帮助你学习 Android 开发基础知识并快速设置工作环境。本指南是针对 Windows 7 编写的,但也适用于 Linux (Ubuntu)、Mac OS X 和 Android SDK 支持的任何其他操作系统。
如果您在彻底遵循这些步骤后遇到任何错误,请随时通过 OpenCV4Android 讨论组或 OpenCV Q&A 论坛联系我们。我们将竭尽全力帮助您。
前言
Android 是由谷歌领导的开放手机联盟开发的基于 Linux 的开源移动操作系统。一般详情请参见 Android 主页。
Android 的开发与其他平台的开发有很大不同。因此,在开始为 Android 编程之前,我们建议您确保熟悉以下关键要点:
- Java 编程语言,这是 Android 操作系统的主要开发技术。此外,您还可以找到 Oracle 有关 Java 的有用文档。
- Java 本地接口(JNI),这是一种在 Java 虚拟机中运行本地代码的技术。此外,Oracle 关于 JNI 的文档也很有用。
- Android Activity 及其生命周期,这是一个基本的 Android API 类。
- OpenCV 开发当然需要了解一些有关 Android 摄像头的具体知识。
手动设置 Android 开发环境
使用 Java 开发
使用 Java 开发 Android 需要安装以下软件:
- Sun JDK 6(也可安装 Sun JDK 7)
访问 Java SE 下载页面,下载适用于您操作系统的安装程序。
以下是 Ubuntu 和 Mac OS 的 JDK(Java 开发工具包)详细安装指南(只有 JDK 部分适用于 OpenCV)
注意事项
OpenJDK 不适用于 Android 开发,因为 Android SDK 仅支持 Sun JDK。如果使用 Ubuntu,安装
Sun JDK 后应运行以下命令设置 Sun java 环境:sudo update-java-alternatives --set java-6-sun
- 安卓 SDK
从 http://developer.android.com/sdk/index.html 获取最新的 Android SDK
以下是 Google 的 SDK 安装指南。
注意事项
你可以选择下载 ADT Bundle 包,其中除 Android SDK 工具外,还包括 Eclipse + ADT +
NDK/CDT 插件、Android Platform-tools、最新的 Android 平台和用于模拟器的最新 Android 系统镜像
- 这是首次创建 Android 开发环境的用户的最佳选择! 如果运行的是 x64 版本的 Ubuntu Linux,则需要安装用于 amd64 和 ia64 系统的 ia32 共享库。你可以使用以下命令安装它们:
sudo apt-get install ia32-libs
对于基于 Red Hat 的系统,以下命令可能会有所帮助:sudo yum install libXtst.i386
- 安卓 SDK 组件
您需要安装以下 SDK 组件:
- Android SDK 工具,版本 20 或更新。
旧版本也可以使用,但不推荐使用。
- SDK 平台 Android 3.0(API 11)。
OpenCV Java API 支持的最低平台为 Android 2.2(API 8)。这也是运行所提供示例所需的最低 API 级别。请参见 AndroidManifest.xml 文件中的 标签。但要成功编译,目标平台应设置为 Android 3.0(API 11)或更高版本。这不会妨碍它们在 Android 2.2 上运行。
有关安装/更新 SDK 组件的帮助,请参阅添加平台和软件包。
- Eclipse IDE
请查看 Android SDK System Requirements(Android SDK 系统要求)文档,查看与 Android SDK 兼容的 Eclipse 版本列表。对于 OpenCV 2.4.x,我们推荐使用 Eclipse 3.7 (Indigo) 或 Eclipse 4.2 (Juno)。它们在 Windows 和 Linux 下都能很好地运行 OpenCV。
如果没有安装 Eclipse,可以从官方网站获取。
- Eclipse 的 ADT 插件
这些说明抄自 Android Developers 网站,如果遇到任何与 ADT 相关的问题,请查看该网站。
假设你已安装 Eclipse IDE,如上所述,请按照以下步骤下载并安装 ADT 插件:
a. 启动 Eclipse,然后选择帮助 -> 安装新软件…
b. 单击添加(在右上角)。
c. 在出现的 Add Repository 对话框中,在 Name(名称)中输入 “ADT Plugin”,在 Location(位置)中输入以下 URL:https://dl-ssl.google.com/android/eclipse/
d. 单击确定
注意
如果在获取插件时遇到困难,请尝试在位置 URL 中使用 “http”,而不是 “https”(出于安全考虑,首选 https)。
e. 在 "可用软件 "对话框中,选择 "开发工具 "旁边的复选框,然后单击 “下一步”。
f. 在下一个窗口中,你将看到要下载的工具列表。单击下一步。
注意
如果您还计划使用 Android NDK 开发本地 C++ 代码,请不要忘记同时启用 NDK Plugins 安装。
g. 阅读并接受许可协议,然后单击完成。
注意
如果收到安全警告,称无法确定软件的真实性或有效性,请单击确定。
h. 安装完成后,重新启动 Eclipse。
使用 C++ 进行本地开发
要使用 C++ 进行 Android 开发,您需要安装以下软件:
- Android NDK
要为 Android 平台编译 C++ 代码,您需要 Android Native Development Kit(NDK)。
您可以从下载页面获取最新版本的 NDK。要安装 Android NDK,只需将压缩包解压到电脑上的某个文件夹即可。以下是安装说明。
注意事项
开始前,您可以阅读 Android NDK 存档中docs/
文件夹中的 Android NDK 官方文档。关于使用
Android NDK 构建系统的主要文章在ANDROID-MK.html
文件中。其他信息请参见
APPLICATION-MK.html
、NDK-BUILD.html
文件以及
CPU-ARM-NEON.html
、CPLUSPLUS-SUPPORT.html
和PREBUILTS.html
。
- 用于 Eclipse 的 CDT 插件
如果您选择安装 Eclipse ADT 插件中的 NDK 插件组件(见上图),您的 Eclipse IDE 应该已经拥有 CDT 插件(即 C/C++ Development Tooling)。将 Android NDK 的 C++ 代码编译集成到 Eclipse 编译过程中有几种可能的方法。我们推荐基于 Eclipse CDT(C/C++ 开发工具)生成器的方法。
Android 应用程序结构
通常 Android 应用程序的源代码具有以下结构:
- 项目根文件夹/
- jni/
- libs/
- res/
- src/
- AndroidManifest.xml
- project.properties
- … 其他文件 …
其中
src
文件夹包含应用程序的 Java 代码、res
文件夹包含应用程序的资源(图片、描述用户界面布局的 xml 文件等)、libs
文件夹包含构建成功后的本地库、jni
文件夹包含 C/C++ 应用程序源代码和 NDK 构建脚本Android.mk
和Application.mk
生成的本地库、AndroidManifest.xml
文件向 Android 系统提供了应用程序的基本信息(应用程序名称、主应用程序软件包名称、应用程序组件、所需权限等)。
可以使用 Eclipse 向导或 Android SDK 中的 android 工具创建该文件。
project.properties
是一个文本文件,包含有关目标 Android 平台和其他构建细节的信息。该文件由 Eclipse 生成,也可使用 Android SDK 中的 android 工具创建。
注意事项
编译应用程序的 C++ 部分需要AndroidManifest.xml
和project.properties
文件,因为
Android NDK 编译系统依赖它们。如果其中任何一个文件不存在,请先编译项目的 Java 部分,然后再编译 C++ 部分。
Android.mk
和 Application.mk
脚本
脚本 Android.mk
通常具有以下结构:
LOCAL_PATH := \f$(call my-dir)
include \f$(CLEAR_VARS)
LOCAL_MODULE := <module_name>
LOCAL_SRC_FILES := <list of .c and .cpp project files>
<some variable name> := <some variable value>
...
<some variable name> := <some variable value>
include \f$(BUILD_SHARED_LIBRARY)
这是最小文件 Android.mk
,用于构建 Android 应用程序的 C++ 源代码。请注意,任何 Android.mk
文件的前两行和最后一行都是必须的。
通常情况下,Application.mk
文件是可选的,但在使用 OpenCV 的项目中,当 C++ 中使用 STL 和异常时,也应创建该文件。Application.mk
文件示例:
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := all
注意
我们建议对所有目标机设置 APP_ABI := all。如果要明确指定目标,请在 ARMv5/ARMv6 中使用 armeabi,在
ARMv7 中使用 armeabi-v7a,在 Intel Atom 中使用 x86,在 MIPS 中使用 mips。
从命令行编译应用程序本地部分
以下是编译 Android 应用程序 C++ 部分的标准方法:
警告
我们强烈建议在 Windows 上使用 cmd.exe(标准 Windows 控制台)而不是 Cygwin。只有在绝对确定自己正在做什么的情况下,才能使用后者。Cygwin 并不真正受支持,如果您在使用过程中遇到问题,我们也不可能提供帮助。因此,只有当你有能力自己处理后果时才使用它。
- 打开控制台,进入 Android 应用程序的根文件夹
cd <项目根目录>/
- 运行以下命令
<NDK 所在路径>/ndk-build
注意
在 Windows 系统中,我们建议在标准 Windows 控制台 (cmd.exe) 中使用 ndk-build.cmd,而不是在
Cygwin shell 中使用类似的 bash 脚本。
- 执行该命令后,源代码的 C++ 部分将被编译。
之后就可以(使用 Eclipse 或 Ant 编译工具)编译应用程序的 Java 部分。
注意事项
可以为 ndk-build 设置一些参数: 例 1:详细编译
<path_where_NDK_is_placed>/ndk-build V=1
例 2: 全部重建
<path_where_NDK_is_placed>/ndk-build -B
从 Eclipse 构建应用程序本地部分(CDT 生成器)
将 Android NDK 的本地 C++ 代码编译集成到 Eclipse 构建流程中有几种可能的方法。我们推荐基于 Eclipse CDT(C/C++ 开发工具)生成器的方法。
重要
OpenCV for Android 软件包自 2.4.2 版起包含预配置 CDT 生成器的示例项目。对于您自己的项目,请按照以下步骤操作。
- 定义包含系统中 Android NDK 路径的 NDKROOT 环境变量(例如 “X:\Apps\android-ndk-r8 “或”/opt/android-ndk-r8”)。
在 Windows 系统中,可以通过 “我的电脑”->“属性”->“高级”->"环境变量 "来设置环境变量。在 Windows 7 上,也可以在控制台会话中使用 setx 命令。
在 Linux 和 MacOS 上,环境变量可通过在"~/.bashrc "
文件中添加 "export VAR_NAME=VAR_VALUE "行并注销后再登录来设置。
注释
也可以在 Eclipse IDE 中定义 NDKROOT
环境变量,但应在创建的每个新工作区中定义。如果比起设置系统环境变量,你更喜欢这个选项,打开 Eclipse 菜单 Window ->
Preferences -> C/C++ -> Build -> Environment,按 Add… 按钮并将变量名设为
NDKROOT,值设为本地 Android NDK 路径。#. 之后,你需要重启 Eclipse 以应用更改。
- 打开 Eclipse 并加载要配置的 Android 应用程序项目。
- 通过 Eclipse 菜单 New -> Other -> C/C++ -> Convert to a C/C++ Project 向项目添加 C/C++ Nature。
然后:
4. 选择要转换的项目。指定 “项目类型”= Makefile 项目,“工具链”= 其他工具链。
5. 打开 “项目属性” -> “C/C++ 编译”,取消选中 “使用默认编译命令”,将 "编译命令 "文本从 "make "替换为
Windows 上的"${NDKROOT}/ndk-build.cmd"、
在 Linux 和 MacOS 上改为"${NDKROOT}/ndk-build"。
6. 转到 "行为 "选项卡,更改 "工作台构建类型 "部分,如下图所示:
-
按 “确定”,确保在构建项目时成功调用 ndk-build。
-
如果在 Eclipse 编辑器中打开 C++ 源文件,就会看到语法错误通知。它们并不是真正的错误,但需要进行额外的 CDT 配置。
- 打开项目属性 -> C/C++ 常规 -> 路径和符号,然后为 C++ 添加以下包含路径:
# for NDK r8 and prior:
${NDKROOT}/platforms/android-9/arch-arm/usr/include
${NDKROOT}/sources/cxx-stl/gnu-libstdc++/include
${NDKROOT}/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a/include
${ProjDirPath}/../../sdk/native/jni/include
# for NDK r8b and later:
${NDKROOT}/platforms/android-9/arch-arm/usr/include
${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/include
${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include
${ProjDirPath}/../../sdk/native/jni/include
最后一个路径应更改为 OpenCV4Android SDK 位置的正确绝对路径或相对路径。
这将清除 Eclipse C++ 编辑器中的语法错误通知。
调试和测试
在本节中,我们将为您提供一些简单易懂的说明,告诉您如何设置模拟器或硬件设备来测试和调试 Android 项目。
虚拟设备
AVD(Android 虚拟设备)可能不是测试依赖于 OpenCV 的应用程序最方便的方法,但却是配置最简单的方法。
- 假设你已经安装了 Android SDK 和 Eclipse IDE,在 Eclipse 中进入 Window -> AVD Manager。
- 按下 AVD 管理器窗口中的新建按钮。
- 创建新的 Android 虚拟设备(Android Virtual Device)窗口会让你为新设备选择一些属性,如目标 API 级别、SD 卡大小等。
- 单击 "创建 AVD "按钮后,新的 AVD 将出现在 AVD 管理器中。
- 按 "开始 "启动设备。请注意,任何 AVD(又称模拟器)通常都比硬件 Android 设备慢得多,因此可能需要几分钟才能启动。
- 转到 Eclipse IDE 中的运行 -> 运行/调试,以常规或调试模式运行应用程序。设备选择器(Device Chooser)可让您从正在运行的设备中进行选择或启动一个新设备。
硬件设备
如果你有 Android 设备,可以用它来测试和调试你的应用程序。这种方式更真实,不过设置起来有点困难。要在 Windows 和 Linux 操作系统上使用安卓设备,需要进行一些操作。Mac OS 不需要额外操作。有关配置硬件设备的详细信息,请参阅下文各小节。
你也可以查阅官方 Android 开发者网站的说明,了解更多信息。
Windows 主机
- 在 Android 设备上启用 USB 调试(通过 "设置 "菜单)。
- 用 USB 电缆将安卓设备连接到电脑。
- 转到 "开始 "菜单,右键单击 “计算机”。在右键菜单中选择 “管理”。您可能会被要求获得管理权限。
- 在左侧窗格中选择 “设备管理器”,然后在列表中找到未知设备。您可以尝试拔下它,然后再插回去,以检查列表中出现的是否正是您的设备。
- 试试在不做任何修改的情况下安装 Google USB 驱动程序的运气:右键单击未知设备,选择 "属性 "菜单项 -> "详细信息 "选项卡 -> "更新驱动程序 "按钮。
- 选择浏览计算机以获取驱动程序软件。
- 指定
<Android SDK 文件夹>/extras/google/usb_driver/
文件夹的路径。
- 如果提示安装未验证的驱动程序并报告成功,则 USB 驱动程序安装完成。
- 否则(出现如下图所示的故障),请执行下一步操作。
- 再次右键单击未知设备,选择 “属性”->“详细信息”->“硬件编号”,然后复制
USB\VID_XXXX&PID_XXXX&MI_XX
这样的行。
- 现在打开文件 <Android SDK 文件夹>/extras/google/usb_driver/android_winusb.inf。根据主机系统架构选择 Google.NTx86 或 Google.NTamd64 部分。
- 您的设备应该有一条类似于现有记录的记录,您需要手动添加一条。
- 保存
android_winusb.inf
文件并尝试再次安装 USB 驱动程序。
- 这次安装应该会成功。
- 现在,未知设备已被识别为安卓手机。
- 可在控制台中通过 adb devices 命令验证设备 USB 连接是否成功。
- 现在,在 Eclipse 中进入运行 -> 运行/调试,以常规或调试模式运行应用程序。设备选择器会让你在设备中进行选择。
Linux 主机
默认情况下,Linux 无法识别 Android 设备,但要解决这个问题很容易。在 Ubuntu Linux 上,你必须新建一个**/etc/udev/rules.d/51-android.rules**配置文件,其中包含有关 Android 设备的信息。你可以在这里找到一些供应商 ID,或执行 lsusb 命令查看已插入的安卓设备的供应商 ID。下面是 LG 设备的此类文件示例:
SUBSYSTEM=="usb", ATTR{idVendor}=="1004", MODE="0666", GROUP="plugdev"
然后重启 adb 服务器(最好重启系统),插入 Android 设备并执行 adb devices 命令。你将看到已连接设备的列表:
Mac OS 主机
无需任何操作,只需通过 USB 连接设备并运行 adb 设备检查连接情况。
下一步
现在,当你建立并配置好开发环境后,你可能想继续安装 OpenCV4Android SDK。您可以在单独的 OpenCV4Android SDK 教程中了解如何安装。