前言:
近期打算搞搞opencv,搜了一大堆的中文资料后,发现多半都已经过时了,只好去搜官网来重新研究了。一看发现和现在的中文资料出入非常大,于是就有了下面这篇文章。
参考(不是完全翻译的):
http://docs.opencv.org/doc/tutorials/introduction/android_binary_package/android_dev_intro.html
搭建环境:win7家庭版(32bit)
在做opencv开发之前,官网上的说法是建议你具备以下知识:
1. Android上的java开发;
2. Java Native Interface (JNI):在java虚拟机上运行本地代码的技术;
3. Android Activity和它的生命周期,这是android开发的精华部分;
4. OpenCV 开发还需要一些Android 相机开发相关的知识。
掂量了一下自己,第一项勉强算是做过俩月;第二项没接触过;第三项基本空白,模糊知道一点;第四项嘿嘿,刚好做过一下。算六十分吧,好,开工。
番外篇:
快速android开发环境搭建:
下载地址:https://developer.nvidia.com/tegra-android-development-pack
解压直接安装就完了,网站上这么说的,我没做过,don’t ask me,pls.
注释:
l TADP从v2.0开始包含了OpenCV for Tegra SDK(这个是Tegra扩展的OpenCV4Android SDK);
l NVIDIA的Tegra Android 开发包包括一些NVIDIA Tegra平台的特性,但是它并不仅限于Tegra设备使用;
l 安装需要1.6g空间;
l TADP 会从google服务器上下载android sdk平台和android ndk,所以网络通畅是必须的;
l 安装的最后,TADP可能会问你刷新你的开发包,如果你压根就没有什么Tegra开发包直接跳过这步;
l Unix上安装中途需要root权限(这个跟我更没关系了)。
番外篇写完了,我选择下面更折腾的方式,为啥?我的机器上遍布jdk、eclipse、adt、adroid-sdk、ndk(还有两种,google的和crystax的)和cygwin(还搞了一堆的什么vi、gcc、cmkae一类的),让我直接铲平?想回头太难,一点点收拾吧。不是我变态,这世界变化快呀。
干下面的活之前,建议大家先上个大号撇个大条,真的,不是一般的折腾,要有思想准备。
人工配置开发环境开始:
1. SUN JDK6(JDK7也行)
神马?连jdk都木有?那就自己下载吧:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
我看了看,我有个jdk1.6.0_03,配置下环境变量就该行了吧
SET JAVA_HOME=C:\LHANDROID\android\Java\jdk1.6.0_03
SETCLASSPATH=.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\bin;
SET PATH=%PATH%;%JAVA_HOME%\bin;
这个配置不用讲了吧,地球人都该知道:
win7为例:
计算机--属性--高级系统设置--高级--环境变量--系统变量
该增加增加,该修改修改吧
2. Android SDK
最新版本下载:http://developer.android.com/sdk/index.html
我当时是直接运行:installer_r20.0.3-windows.exe 进行安装,然后进入安装目录android-sdk,找到SDKManager.exe进行升级安装的。
3. Android SDK components
l Android SDK Tools:revision20或者更新:老点的也能用,不过最好用新的;
l SDK Platform Android 3.0 (API 11):最低限度android2.2(API8) ,所以AndroidManifest.xml中 <uses-sdk android:minSdkVersion="8"/> 这个值最低得是8,目标平台得是android3.0(api11)或者更高,当然这个不会阻碍程序在android2.2上正常运行。
哎哟,检查一下我的sdk版本先,运行安装目录下的SDK Manager.exe,看看版本:
001.jpg
嘿嘿,看到没,虽然咱下载了没安装最新的,两个条件都达标了。
4. EclipseIDE
OpenCV 2.4.x 建议 Eclipse 3.7(Indigo)或者更新版本
检查了一下我的eclipse是3.7.1,也达标了。
另:版本号对应
Eclipse 3.1 版本代号 IO 【木卫1,伊奥】
Eclipse 3.2 版本代号 Callisto 【木卫四,卡里斯托 】
Eclipse 3.3 版本代号 Eruopa 【木卫二,欧罗巴 】
Eclipse 3.4 版本代号 Ganymede 【木卫三,盖尼米德 】
Eclipse 3.5 版本代号 Galileo 【伽利略】
Eclipse 3.6 版本代号 Helios 【太阳神】[据说2010年6月发布正式版]
Eclipse 3.7 版本代号 Indigo 【靛青】
5. ADT plugin for Eclipse
ADT: android debug tools
002.jpg
Add Repository 对话框中,Name随便起个名字,然后Location输入:
https://dl-ssl.google.com/android/eclipse/
点击确定,如果下载不了,试试用http替换https,如果还不行,就每天没事去试试,为啥连接不上?用脚趾头想想,你懂的。
如果能连接上,要不了几分钟就能下载安装好,如果连接不上,捶胸顿足呼天抢地也是白搭,同学,要淡定,多试试。
如果顺利,大概就是下面这个样子,别忘记了安装上NDK的插件呀,装好了重启一下eclipse:
003.jpg
6. C++本地代码开发
为了android里面用c++开发,你需要安装下面的软件
6.1 NDK: Android Native Development Kit
在android平台上编译c++代码需要NDK,你可以在下面url取得最新版本:
http://developer.android.com/tools/sdk/ndk/index.html
下载android-ndk-r8d-windows.zip 解压后,配置环境变量,例如:
PATH=%PATH%;C:\PROGRAM\android-ndk-r8b\
在你看Android NDK的官方文档之前(docs目录下),你可以直接看:
Ø ANDROID-MK.html
Ø APPLICATION-MK.html
Ø NDK-BUILD.html files
Ø CPU-ARM-NEON.html
Ø CPLUSPLUS-SUPPORT.html
Ø PREBUILTS.html
了解如何使用ndk编译系统。
评:之前看到文章都是说google的标准ndk不能很好支持opencv,所以需要使用crystax的ndk,看来此一时彼一时呀。
6.2 CDT plugin for Eclipse
如果你安装adt插件的时候,勾选了NDK插件的话,CDT就已经安装了
7. Android应用程序结构
通常代码结构如下:
project/
jni/
libs/
res/
src/
AndroidManifest.xml
project.properties
... other files ...
说明:
jni:包括c/c++代码文件和ndk的编译脚本:Android.mkand Application.mk
libs:存放编译成功的本地代码库文件
res:资源文件目录,包括项目中的图片和ui布局xml文件等;
src:java代码存放路径
AndroidManifest.xml:里面写了应用程序名称、应用程序各个组件(activity和service等)和需要的权限这些内容
project.properties:文本文件,内容包括目标android平台版本和其他编译细节
编译c++部分代码的时候需要AndroidManifest.xml和project.properties。
编译脚本:Android.mk and Application.mk
Android.mk 通常如下结构,用来编译android应用程序中的c++代码,前两行和最后一行是必须要有的。
LOCAL_PATH := $(call my-dir)
include $(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 $(BUILD_SHARED_LIBRARY) |
Application.mk 是可有可无的,但是一旦项目中使用了OpenCV,当c++代码中使用了STL(Standard Template Library/标准模板库)和异常,Application.mk就需要了,示例:
APP_STL := gnustl_static APP_CPPFLAGS := -frtti -fexceptions APP_ABI := all |
建议 APP_ABI:=all 以便编译结果适应所有目标机器。如果你想明确指定某些机器,使用:
armeabi for ARMv5/ARMv6
armeabi-v7a for ARMv7
x86 for Intel Atom
mips for MIPS
8. 命令行编译本地代码部分
下面是编译android应用程序中的c++部分代码的标准方法。
警告:强烈建议使用cmd.exe而不是cygwin for windows来进行编译。官方人员说法是如果你用cygwin遇到问题,别来烦我,官方人员都懒得对付这种破事,别指望我有那本事。所以除非你有绝对信心能搞定,否则就别用cygwin了。
评:之前搜到的opencv的编译都是在cygwin下完成的,这下改法子了。
编译步骤很简单,一句话说完:
cmd.exe中进入android项目目录,运行ndk中的ndk-build.cmd,没了,写复杂一点:
Ø 打开cmd.exe
Ø cd <root folder of the project>/
Ø <path_where_NDK_is_placed>/ndk-build.cmd
参考:
冗余信息编译,不是很清楚,是指编译完成后的文件中包括符号表还是只编译后的代码会有什么类似日志信息一类的:
<path_where_NDK_is_placed>/ndk-buildV=1
全部(android项目中的c++部分代码)重新编译:
<path_where_NDK_is_placed>/ndk-build –B
编译完了android项目中的c++部分代码,就可以编译java部分了。
9. 使用eclipse的CDT插件编译android应用程序中的c++部分代码
当我看到那么一大堆东西的时候,我承认我怂了,我宁可跑去cmd.exe敲命令行编译,也懒得去eclipse里面配置,麻烦死了。
此处省略n字。期待有兴趣的同学来完成这部分内容,哥们敲命令行去了。See u!
10. 调试和运行
这一部分的内容就是如何建立启动模拟器,安装驱动程序连接手机,写了那叫一个详细,不过说老实话,祖国人民不会这么搞法的。随便搞一个豌豆荚、腾讯手机管家或者360手机助手啥的,手机插进去,不就自己装上驱动了,不用这么复杂吧。
然后,就发现这篇文章没了,突然发现连opencv在哪里下载都没有提到,我倒,继续搜,只能抱歉的跟大家说,请听下回书分解。