windows 在 Android NDK 中编译 OpenCV

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5303598/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-15 16:26:20  来源:igfitidea点击:

Compiling OpenCV in Android NDK

androidwindowsopencvcygwinandroid-ndk

提问by florianbaethge

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!

请查看底部的添加内容!第一个问题在Linux下解决了,在Windows和Cygwin下还没有解决,但是又出现了一个新问题。请看下面!

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:

我目前正在尝试为 Android NDK 编译 OpenCV,以便我可以在我的应用程序中使用它。为此,我尝试遵循本指南:

http://www.stanford.edu/~zxwang/android_opencv.html

http://www.stanford.edu/~zxwang/android_opencv.html

But when compiling the downloaded stuff with ndk-build I get this error:

但是当用 ndk-build 编译下载的东西时,我得到这个错误:

$ /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
Compile++ 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...

我正在尝试在 Windows 系统上使用最新的 NDK 版本编译它...

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.

在解决这个问题后,我发现还有另一种为 Android 编译 OpenCV 的方法,使用当前版本的 OpenCV(而不是上面的 1.1 版本)和来自 Crystax 的修改后的 Android NDK,它支持 STL 和异常,因此支持最新的 OpenCV 版本。

All information on that can be found here: http://opencv.willowgarage.com/wiki/Android

可以在此处找到所有相关信息: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.

那里说要下载当前的 svn trunk 和 crystax-r4 android-ndk,以及 swig,我就是这样做的。

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.

我进入文件夹,创建构建目录,运行 cmake,然后构建静态库,这似乎有效。至少它成功地运行了 make-command 没有错误。

I now wanted to build the shared libraries so I entered the android-jni folder and ran 'make' again, but got this error:

我现在想构建共享库,所以我进入了 android-jni 文件夹并再次运行“make”,但得到了这个错误:

% 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:

好的,在查看了错误消息后,我发现构建目录中似乎缺少某些内容……但 android 文件夹中甚至没有构建目录,所以我创建了一个,在在那里再次“制作”,但出现此错误:

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?

有人知道这是什么意思吗?

回答by Matthew Willis

I just built it with ndk-r5b on Linux. Do you have a default.propertiesfile in your project directory (not jni) that has something like the following:

我刚刚在 Linux 上用 ndk-r5b 构建了它。你有一个default.properties文件在您的项目目录(不jni),有像下面这样:

target=android-8

If not, you might try creating it and building again.

如果没有,您可以尝试创建它并重新构建。

回答by alex

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

对于 cygwin,标准的 gcc 规范文件包含 -dll-search-prefix=cyg,因此实际上我们实际上搜索的是 cygxxx.dll。(不适用于 libcxcore.a)所以您需要将 libxxx.a 复制到 cygxxx.a 并将它们放在一些可用于链接器的目录中。我在http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/4/html/Using_ld_the_GNU_Linker/win32.html找到了这个解决方案