Android-opencv是opencv在Android手机上的移植版。本人花了很多时间,终于在今天将OpenCV成功生成了.apk文件,在手机上运行成功。
在网上看到很多有关于这方面的文章,但感觉有很多地方说的并不详细。写此文的目的也就在于详细的介绍Android-OpenCV从下载一直到生成.apk的步骤。
(ps:编译Android-OpenCV的前提是Android平台已成功搭建。本人所使用的SDK为2.1,ndk为android-ndk-r4-crystax,其他的比如Cygwin,Eclipse等等属于平台搭建工作,我想读者们都已经开始学习OpenCV了,平台搭建应该早已成功了吧~ 此文就不再赘述。)
下面我们就开始正式进入Android-OpenCV的编译。
1.我们首先需要下载SVN。(一个版本控制工具,用于从Google Code上下载源代码。)
SVN下载地址:http://download.csdn.net/source/3357008
安装后,在电脑桌面上点击右键,选择SVN CheckOut,用它来CheckOut
http://android-opencv.googlecode.com/svn/trunk
现在的svn需要用户名和密码,因此该文件夹请在我发布的资源中免积分下载。地址如下:
http://download.csdn.net/source/3505737
CV文件夹中存放的便是我们所需要的所有源代码。
注意:
2.下一步,启动Cygwin,通过CD命令进入D:/CV/opencv,输入sh build.sh,进行编译。
整个编译过程大约需要20分钟。成功后,会在D:/opencv/android/libs/armeabi和 armeabi-v7a两个文件夹生成.so文件。而这也就是我们下面所需要动态链接库。
3.打开Eclipse,新建Android projects,选择Create projects from existing projects,导入刚才build的工程。如下图所示。
导入后选择run as Android application,进行编译。成功后在虚拟机上无任何反应。若显示如下信息则表示成功:
但可能会出现如下错误:
(1). Re-installation failed due to different application signatur
从而导致 launch canceled。
解决办法是用adb uninstall命令将opencv卸载,重新安装Opencv即可。
具体步骤为:启动cmd,输入adb uninstall com.opencv,成功后返回Eclipse,点击Run as Android application进行重新安装即可。
(2).adb命令为无效命令,最简单的做法是把Android SDK 文件夹Tools文件夹里面的 adb.exe 和 AdbWinApi.dll 两个文件放到系统盘的 windows/system32 文件夹里。
(3).com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper] Unable to read D:/Android 1/android-sdk-windows/AndroidManifest.xml: java.io.FileNotFoundException: D:/Android 1/android-sdk-windows/AndroidManifest.xml (系统找不到指定的文件。)
此错误经常出现在编译的最初两行。解决办法其实很简单。进入:C:/Documents and Settings/Administrator/.android
删除:debug.keystore及 ddms.cfg即可。
也就是export到自己的sample文件夹中。
若未遇到上述问题,那么恭喜你可以进入下一个步骤~
4.打开cygwin,去到/samples/CVCamera/,输入sh build.sh,(与build opencv类似)开始编译CVCamera的JNI,成功编译之后会生成libcvcamera.so。
5.同样的方法导入CVCamera这个工程,编译CVCamera这个工程,生成CVCamera.apk(有6.06MB大小)
在这当中同样可能会出现一些错误:
出现“Android library projects cannot be launched”时,检查工程属性中的Android选项,其Is library 单选框是不能打勾的。
6. 最后,虚拟机上出现CVCamera应用程序图标。当然,此程序在虚拟机上运行只会一闪而过。真正的测试需在真机上完成。
至此,OpenCV及其例程CVCamera的编译便全部完成。