这几天在练习一个在android上面进行图片格式转换的例子,我的开发环境是winXP+cygwin+openCV+NDK(r4 crystax),这个例子用openCV来做再合适不过了.在windows上面VS开发其实就下面这几句代码:
IplImage* img = cvLoadImage(szOriPic);
cvSaveImage( szNewPic , img);
cvReleaseImage( &img );
在android上面做这个开发,需要用到ndk.openCV和NDK配置过程比较麻烦,csdn上面很多人的博客上面都有介绍.配置完成之后,代码也写好了.Android.mk文件也仿造别人的写好了,.so文件也顺利编译出来了,开始在模拟器上面运行,结果程序一闪就退出了.如果去掉openCV函数的代码,程序可以正常运行.据此可以判断问题就出现在openCV的函数上
面.Google出来的结果发现有人曾经遇到过这个问题,一种说法是在真机上面运行就不会出现这个问题,如果在模拟器上面就会出现这个问题.但是手头上面没有真机,所以这个方法无法验证.
继续找看有没有其他的方法,在http://blogold.chinaunix.net/u1/57901/showart_2512389.html这篇博文里面也提到了这个问题,而且给出了具体的解决方案,以下是这个解决方案的说明:"这时候编译出来的程序还不能在虚拟机中运行,一运行就会闪一下跳出来,这是因为opencv的android库中有V5和V7两种ARM架构的库,我发现一般都会优先运行V7架构的ARM库,但是虚拟机应该是个V5架构的,所以会马上退出,我的G2手机也一样,所以这时候还要对OpenCV-2.2.0/android/build/android-opencv.mk文件进行修改来让程序在V5架构的ARM上运行".但是这篇文章所讲的是在linux下解决方法,我并没有找到文中所提到的android-opencv.mk以及相关的.mk文件.所以这种方法最终还是没有解决我的问题.
在google code中的android-opencv板块中有人也出现了这个问题,其中有一个人的回答解决了我的问题.解决方法是需要在android.mk中添加下面的静态库:
参考URL:http://code.google.com/p/android-opencv/issues/detail?id=7(12楼和14楼的回答)
LOCAL_C_INCLUDES += $(OPENCV_INCLUDES)
LOCAL_STATIC_LIBRARIES := calib3d features2d objdetect imgproc \
video highgui ml legacy core libopencv_lapack flann \
libzlib libpng libjpeg libjasper
这些库需要从从C:\cygwin\home\user\trunk\opencv\obj\local\armeabi这个目录中将这些.a静态库文件copy 到自己程序的obj\local\armeabi目录中去.这时再ndk-build,重新在模拟器上运行程序.(具体的目录需要替换成自己的实际的opencv以及程序的目录).这些静态库是以.a为扩展名的,而且openCV的版本不同,可能这些库的名字也不同.做完以上改变,重新编译我们的cpp文件,然后重新build程序在模拟器上运行.这时一切都正常了
稍后会把这个图片格式转换的程序整理一下,把整个过程写出来.
转载请注明出处:http://blog.csdn.net/fenghaibo00