网上关于这一块的东西,人云亦云,我这里基于最新的一些东西写出来分享给大家。主要是查来查去,要么是很老的说cywin,要么是ubuntu环境。我今天主要讲几个点:
1. NDK编译, r7以上都不需要cywin或者linux环境;
2. win7,eclipse配置NDK环境这一块;
3. openCV sample face detection报错解决,调试运行OK。
问题:在win7上,eclipse导入了openCV Sample face detection的包后,一直是红色的报错,如何处理?
一. java, eclipse, adt略过(不要问为什么*_*);
二. Manager apk
手机要安装OpenCV android SDK对应的manager APK。(很早之前的openCV没这玩意,目前较新的都有,但是要注意版本相互对应)。
三. 导入OpenCV Library代码
它提供了基本的jar。它存在于openCV android sdk中的sdk\java下,其实你也可以直接选择他的根目录,自己单选即可。如果该代码报错,说明的android环境有误。
如果library无问题,右键点击face detection工程的properties->android,你会看到有个红色的,所以将它删掉,点击add,选择Open CV Library,就能加载进来。对于纯java的opencv就能正常跑了。
这个时候,我们也能运行起来程序,但是到了手机就报错了。会说loadLibrary()的错误。这是因为NDK没有将lib jni库编译出来,怎么能正常运行呢?接着我们就来NDK的安装。
四. jni目录Android.mk
大家是否注意到在该文件有这么一句话,include ../../sdk/native/jni/OpenCV.mk 。这是也是导致不能编译的主要原因。
也就是说他的编译,需要依赖于opencv 的一些c代码。所以我在想要么把这个路径改掉,比如改成D:\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk,这是可以的(某些很老的oepncv版本不支持绝对路径)。另外,你可以推测,这里相对的路径其实是相对该代码的目录,而不是jni的目录,所以比如我,D:\android_development\workspaceA\OpenCV Sample - face-detection倒退2个目录,拷贝一下sdk,就行了。两种方法随你选。
五.NDK环境配置
2.1系统NDK环境
我的电脑右键->高级系统设置->环境变量, 将系统变量中的Path,追加 ;D:\android_development\android_ndk_r9d
这里很多帖子一直说要个用户变量NDK_PATH,然后再%NDK_PATH%搞过去(这种方式可能需要重启)。其实也没什么必要,直接将路径追加上去,不需要重启。
注意前面有个“;”号,目录换成你的。在cmd中输入ndk-build -version查看是否成功。
2.2 eclipse环境
记得在调试的时候,要经常多重启下eclipse,比如刚刚我们配好了NDK环境,你的cmd.exe验证是否安装成功, 你的eclipse都是需要重启的,所以多重启eclipse和cmd。
这个时候,你再执行android的Run As -> android application的时候,注意查看Console中会提示:
**** Auto Build of configuration Default for project OpenCV Sample - face-detection ****
"\\ndk-build.cmd"
Cannot run program "\ndk-build.cmd": Launching failed
a. window->perefence->Android->NDK, 将NDK location设置为你的ndk目录,与上面路径是一样的;
b. window->perefence->c/c++->Build->Environment, 点击Add, 在弹出来的窗口随便起个名字,如NDKPATH,路径直接写,也是一样的路径,不点后面那个去选择。在弹出的窗口必须写成NDKROOT才能生效。 ---0517更新。
记得重启你的eclipse!
再次运行到Android手机的时候,Console提示了如下,说明我们的NDK搞定了!程序也不再报错。
Android NDK: WARNING:jni/Android.mk:detection_based_tracker: non-system libraries in linker flags: -lopencv_java
Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK: current module
[armeabi-v7a] Install : libdetection_based_tracker.so => libs/armeabi-v7a/libdetection_based_tracker.so