【问题标题】:Build error on Android with OpenCV 3.2.0 and Jni使用 OpenCV 3.2.0 和 Jni 在 Android 上构建错误
【发布时间】:2019-07-07 09:34:32
【问题描述】:

我正在尝试使用 OpenCV 和 Jni 编写一个 Android 应用程序来比较图像并找到匹配项。我已经在 android 中成功使用 OpenCV 3.2.0(使用官方预构建的 Android 包)。 但是当我尝试使用 knnMatch 函数时,它给了我这个错误消息:

  Build command failed.
  Error while executing process 
  D:\Android\sdk\cmake\3.6.4111459\bin\cmake.exe with arguments {--build 
  C:\Users\Amine\Desktop\testtt\app\.externalNativeBuild\cmake\debug\arm64- 
  v8a --target native-lib}
  [1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native- 
  lib.cpp.o
  [2/2] Linking CXX shared library 
   ..\..\..\..\build\intermediates\cmake\debug\obj\arm64-v8a\libnative-lib.so
  FAILED: cmd.exe /C "cd . && D:\Android\sdk\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe  --target=aarch64-none-linux-android21 --gcc-toolchain=D:/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64 -fPIC --sysroot 
  D:/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -Wa,--noexecstack -Wformat -Werror=format-security -stdlib=libc++ -frtti -fexceptions -std=gnu++11 -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libnative-lib.so -o ..\..\..\..\build\intermediates\cmake\debug\obj\arm64-v8a\libnative-lib.so 
    CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o   ../../../../src/main/jniLibs/arm64-v8a/libopencv_java3.so -latomic -lm && cd ."
     CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o: In function `toGray(cv::Mat&, cv::Mat&)':

  C:\Users\Amine\Desktop\testtt\app\src\main\cpp/native-lib.cpp:216: undefined reference to `cv::DescriptorMatcher::knnMatch(cv::_InputArray const&, cv::_InputArray const&, std::__ndk1::vector<std::__ndk1::vector<cv::DMatch, std::__ndk1::allocator<cv::DMatch> >, std::__ndk1::allocator<std::__ndk1::vector<cv::DMatch, std::__ndk1::allocator<cv::DMatch> > > >&, int, cv::_InputArray const&, bool) const'

  C:\Users\Amine\Desktop\testtt\app\src\main\cpp/native-lib.cpp:220: undefined reference to `cv::DescriptorMatcher::knnMatch(cv::_InputArray const&, cv::_InputArray const&, std::__ndk1::vector<std::__ndk1::vector<cv::DMatch, std::__ndk1::allocator<cv::DMatch> >, std::__ndk1::allocator<std::__ndk1::vector<cv::DMatch, std::__ndk1::allocator<cv::DMatch> > > >&, int, cv::_InputArray const&, bool) const'

clang++.exe:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

这是我的 cpp 代码:

std::vector<cv::KeyPoint> keypointsCaptured;
std::vector<cv::KeyPoint> keypointsTarget;

cv::Mat descriptorsCaptured;
cv::Mat descriptorsTarget;
//cv::Mat captured;
std::vector<cv::DMatch> matches;
std::vector<cv::DMatch> symMatches;
orb = ORB::create();

//Pre-process
resize(captured, captured, Size(480,360));
medianBlur(captured, captured, 5);

resize(target, target, Size(480,360));
medianBlur(target, target, 5);

orb->detectAndCompute(captured, noArray(), keypointsCaptured, descriptorsCaptured);
orb->detectAndCompute(target, noArray(), keypointsTarget, descriptorsTarget);
//__android_log_print(ANDROID_LOG_INFO, "sometag", "keypoints2 size = %d", keypointsTarget.size());
//__android_log_print(ANDROID_LOG_INFO, "sometag", "keypoints size = %d", keypointsCaptured.size());

//Match images based on k nearest neighbour
std::vector<std::vector<cv::DMatch> > matches1;
matcher.knnMatch(descriptorsCaptured , descriptorsTarget,
                 matches1, 2);
//__android_log_print(ANDROID_LOG_INFO, "sometag", "Matches1 = %d",     matches1.size());
std::vector<std::vector<cv::DMatch> > matches2;
matcher.knnMatch(descriptorsTarget , descriptorsCaptured,
                 matches2, 2);
//Ratio filter
ratioTest(matches1);
ratioTest(matches2);
symmetryTest(matches1,matches2,symMatches);
ransacTest(symMatches,
           keypointsCaptured, keypointsTarget, matches);

【问题讨论】:

  • 您是否尝试更改 OpenCV 版本?尝试添加到 gradle 文件“implementation 'com.quickbirdstudios:opencv:3.4.4-contrib'”并使用 3.4.4 重建
  • 我应该重新下载其他 OpenCv 版本吗?
  • 将导入更改为 3.4.4 并同步 gradle - 它将自动下载
  • 谢谢。正在同步。
  • @Raskilas 同样的问题仍然存在。

标签: android opencv image-processing opencv4android orb


【解决方案1】:

修复将 NDK 版本降低到 17c 并像这样编辑 Gradle 文件:

 externalNativeBuild {
        cmake {
            arguments '-DANDROID_TOOLCHAIN=clang', '-DANDROID_ARM_NEON=TRUE', '-DANDROID_STL=gnustl_shared'
            cFlags '-O3', '-fsigned-char'
            cppFlags "-frtti -fexceptions", '-fsigned-char'
        }
    }

此外,如果您使用的 Cmake 版本高于 3.6,请将其添加到 Gradle 的 cmake 标签下:

  version "3.10.2"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多