1. 程式人生 > >在android模擬器上面執行OpenCV函式一閃就退出的解決方法

在android模擬器上面執行OpenCV函式一閃就退出的解決方法

    這幾天在練習一個在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