Compiling OpenCV in Android NDK
PLEASE SEE THE ADDITIONS AT THE BOTTOM! The first problem is solved in Linux, not under Windows and Cygwin yet, but there is a new problem. Please see below!
I am currently trying to compile OpenCV for Android NDK so that I can use it in my apps. For this I tried to follow this guide:
http://www.stanford.edu/~zxwang/android_opencv.html
But when compiling the downloaded stuff with ndk-build I get this error:
$ /cygdrive/u/flori/workspace/android-ndk-r5b/ndk-build
Compile++ thumb : opencv <= cvjni.cpp
Compile++ thumb : cxcore <= cxalloc.cpp
Compile++ thumb : cxcore <= cxarithm.cpp
Compile++ thumb : cxcore <= cxarray.cpp
Compile++ thumb : cxcore <= cxcmp.cpp
Compile++ thumb : cxcore <= cxconvert.cpp
Compile++ thumb : cxcore <= cxcopy.cpp
Compile++ thumb : cxcore <= cxdatastructs.cpp
Compile++ thumb : cxcore <= cxdrawing.cpp
Compile++ thumb : cxcore <= cxdxt.cpp
Compile++ thumb : cxcore <= cxerror.cpp
Compile++ thumb : cxcore <= cximage.cpp
Compile++ thumb : cxcore <= cxjacobieigens.cpp
Compile++ thumb : cxcore <= cxlogic.cpp
Compile++ thumb : cxcore <= cxlut.cpp
Compile++ thumb : cxcore <= cxmathfuncs.cpp
Compile++ thumb : cxcore <= cxmatmul.cpp
Compile++ thumb : cxcore <= cxmatrix.cpp
Compile++ thumb : cxcore <= cxmean.cpp
Compile++ thumb : cxcore <= cxmeansdv.cpp
Compile++ thumb : cxcore <= cxminmaxloc.cpp
Compile++ thumb : cxcore <= cxnorm.cpp
Compile++ thumb : cxcore <= cxouttext.cpp
Compile++ thumb : cxcore <= cxpersistence.cpp
Compile++ thumb : cxcore <= cxprecomp.cpp
Compile++ thumb : cxcore <= cxrand.cpp
Compile++ thumb : cxcore <= cxsumpixels.cpp
Compile++ thumb : cxcore <= cxsvd.cpp
Compile++ thumb : cxcore <= cxswitcher.cpp
Compile++ thumb : cxcore <= cxtables.cpp
Compile++ thumb : cxcore <= cxutils.cpp
StaticLibrary : libstdc++.a
StaticLibrary : libcxcore.a
Compile++ thumb : cv <= cvaccum.cpp
Compile++ thumb : cv <= cvadapthresh.cpp
Compile++ thumb : cv <= cvapprox.cpp
Compile++ thumb : cv <= cvcalccontrasthistogram.cpp
Compile++ thumb : cv <= cvcalcimagehomography.cpp
Compile++ thumb : cv <= cvcalibinit.cpp
Compile++ thumb : cv <= cvcalibration.cpp
Compile++ thumb : cv <= cvcamshift.cpp
Compile++ thumb : cv <= cvcanny.cpp
Compile++ thumb : cv <= cvcolor.cpp
Compile++ thumb : cv <= cvcondens.cpp
Compile++ thumb : cv <= cvcontours.cpp
Compile++ thumb : cv <= cvcontourtree.cpp
Compile++ thumb : cv <= cvconvhull.cpp
Compile++ thumb : cv <= cvcorner.cpp
Compile++ thumb : cv <= cvcornersubpix.cpp
Compile++ thumb : cv <= cvderiv.cpp
Compile++ thumb : cv <= cvdistransform.cpp
Compile++ thumb : cv <= cvdominants.cpp
Compile++ thumb : cv <= cvemd.cpp
Compile++ thumb : cv <= cvfeatureselect.cpp
Compile++ thumb : cv <= cvfilter.cpp
Compile++ thumb : cv <= cvfloodfill.cpp
Compile++ thumb : cv <= cvfundam.cpp
Compile++ thumb : cv <= cvgeometry.cpp
Compile++ thumb : cv <= cvhaar.cpp
Compile++ thumb : cv <= cvhistogram.cpp
Compile++ thumb : cv <= cvhough.cpp
Compile++ thumb : cv <= cvimgwarp.cpp
Comp开发者_如何转开发ile++ thumb : cv <= cvinpaint.cpp
Compile++ thumb : cv <= cvkalman.cpp
Compile++ thumb : cv <= cvlinefit.cpp
Compile++ thumb : cv <= cvlkpyramid.cpp
Compile++ thumb : cv <= cvmatchcontours.cpp
Compile++ thumb : cv <= cvmoments.cpp
Compile++ thumb : cv <= cvmorph.cpp
Compile++ thumb : cv <= cvmotempl.cpp
Compile++ thumb : cv <= cvoptflowbm.cpp
Compile++ thumb : cv <= cvoptflowhs.cpp
Compile++ thumb : cv <= cvoptflowlk.cpp
Compile++ thumb : cv <= cvpgh.cpp
Compile++ thumb : cv <= cvposit.cpp
Compile++ thumb : cv <= cvprecomp.cpp
Compile++ thumb : cv <= cvpyramids.cpp
Compile++ thumb : cv <= cvpyrsegmentation.cpp
Compile++ thumb : cv <= cvrotcalipers.cpp
Compile++ thumb : cv <= cvsamplers.cpp
Compile++ thumb : cv <= cvsegmentation.cpp
Compile++ thumb : cv <= cvshapedescr.cpp
Compile++ thumb : cv <= cvsmooth.cpp
Compile++ thumb : cv <= cvsnakes.cpp
Compile++ thumb : cv <= cvstereobm.cpp
Compile++ thumb : cv <= cvstereogc.cpp
Compile++ thumb : cv <= cvsubdivision2d.cpp
Compile++ thumb : cv <= cvsumpixels.cpp
Compile++ thumb : cv <= cvsurf.cpp
Compile++ thumb : cv <= cvswitcher.cpp
Compile++ thumb : cv <= cvtables.cpp
Compile++ thumb : cv <= cvtemplmatch.cpp
Compile++ thumb : cv <= cvthresh.cpp
Compile++ thumb : cv <= cvundistort.cpp
Compile++ thumb : cv <= cvutils.cpp
StaticLibrary : libcv.a
SharedLibrary : libopencv.so
U:/flori/workspace/android-ndk-r5b/toolchains/arm-linux-androideabi-4.4.3/prebui
lt/windows/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-andr
oideabi/bin/ld.exe: cannot find -lcxcore
collect2: ld returned 1 exit status
make: *** [/cygdrive/u/flori/workspace/android/testOpenCV/obj/local/armeabi/libo
pencv.so] Error 1
I am trying to compile it on a Windows system and with the newest NDK version...
Does anybody have an idea what this linking error means and what I can to to have it work again?
Would be great if anybody could help
After getting the problem to work I found that there is another way of compiling OpenCV for Android, using the current version of OpenCV (instead of the 1.1 one from above) and the modified Android NDK from crystax, which supports STL and exceptions and therefore supports the newest OpenCV Version.
All information on that can be found here: http://opencv.willowgarage.com/wiki/Android
There it says to download the current svn trunk and the crystax-r4 android-ndk, as well as swig, which I did.
I entered the folder, created the build directory, ran cmake and then built the static libs, which seemed to work. At least it successfully ran the make-command without errors.
I now wanted to build the shared libraries so I entered the android-jni folder and ran 'make' again, but got this error:
% make -j4
OPENCV_CONFIG = ../build/android-opencv.mk
make clean-swig &&\
mkdir -p jni/gen &&\
mkdir -p src/com/opencv/jni &&\
swig -java -c++ -package "com.opencv.jni" \
-outdir src/com/opencv/jni \
-o jni/gen/android_cv_wrap.cpp jni/android-cv.i
OPENCV_CONFIG = ../build/android-opencv.mk
make[1]: Entering directory `/home/florian/android-opencv-willowgarage/android/android-jni'
make[1]: warning: jobserver unavailable: using -j1. Add `+' to parent make rule.
rm -f jni/gen/android_cv_wrap.cpp
make[1]: Leaving directory `/home/florian/android-opencv-willowgarage/android/android-jni'
/home/florian/android-ndk-r4-crystax/ndk-build OPENCV_CONFIG=../build/android-opencv.mk \
PROJECT_PATH= ARM_TARGETS="armeabi armeabi-v7a" V=
/home/florian/android-ndk-r4-crystax/ndk-build OPENCV_CONFIG=../build/android-opencv.mk \
PROJECT_PATH= ARM_TARGETS="armeabi armeabi-v7a" V=
make[1]: Entering directory `/home/florian/android-opencv-willowgarage/android/android-jni'
/home/florian/android-opencv-willowgarage/android/android-jni/jni/Android.mk:10: ../build/android-opencv.mk: No such file or directory
make[1]: Entering directory `/home/florian/android-opencv-willowgarage/android/android-jni'
/home/florian/android-opencv-willowgarage/android/android-jni/jni/Android.mk:10: ../build/android-opencv.mk: No such file or directory
/home/florian/android-opencv-willowgarage/android/android-jni/jni/Android.mk:10: ../build/android-opencv.mk: No such file or directory
make[1]: warning: jobserver unavailable: using -j1. Add `+' to parent make rule.
/home/florian/android-opencv-willowgarage/android/android-jni/jni/Android.mk:10: ../build/android-opencv.mk: No such file or directory
make[1]: *** No rule to make target `../build/android-opencv.mk'. Stop.
make[1]: Leaving directory `/home/florian/android-opencv-willowgarage/android/android-jni'
make: *** [libs/armeabi/libandroid-opencv.so] Error 2
make: *** Waiting for unfinished jobs....
make[1]: warning: jobserver unavailable: using -j1. Add `+' to parent make rule.
make[1]: *** No rule to make target `../build/android-opencv.mk'. Stop.
make[1]: Leaving directory `/home/florian/android-opencv-willowgarage/android/android-jni'
make: *** [libs/armeabi-v7a/libandroid-opencv.so] Error 2
Does anybody have an idea what this means and what I can do to build the shared libraries?
...
Ok after having a look at the error message it came to me that it seems to have something missing in the build directory... but there wasn't even a build directory in the android folder so I created one, ran 'cmake' in there and 'make' again but get this error:
Compile thumb : opencv_lapack <= /home/florian/android-opencv-willowgarage/3rdparty/lapack/sgetrf.c
Compile thumb : opencv_lapack <= /home/florian/android-opencv-willowgarage/3rdparty/lapack/scopy.c
Compile++ thumb: opencv_core <= /home/florian/android-opencv-willowgarage/modules/core/src/matrix.cpp
cc1plus: error: /home/florian/android-opencv-willowgarage/android/../modules/index.rst/include: Not a directory
make[3]: *** [/home/florian/android-opencv-willowgarage/android/build/obj/local/armeabi/objs/opencv_core/src/matrix.o] Error 1
make[3]: *** Waiting for unfinished jobs....
make[2]: *** [android-opencv] Error 2
make[1]: *** [CMakeFiles/ndk.dir/all] Error 2
make: *** [all] Error 2
Anybody know what this means?
I just built it with ndk-r5b on Linux. Do you have a default.properties
file in your project directory (not jni
) that has something like the following:
target=android-8
If not, you might try creating it and building again.
In the case of cygwin, the standard gcc spec file includes -dll-search-prefix=cyg, so in effect we actually search for cygxxx.dll. (not for libcxcore.a) So you need to copy your libxxx.a to cygxxx.a and put them in some available for linker directory. This solution i'm found at http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/4/html/Using_ld_the_GNU_Linker/win32.html
精彩评论