错误:升级Android Studio的NDK和Cmake后JNI函数中未定义引用

错误:升级Android Studio的NDK和Cmake后JNI函数中未定义引用,android,cmake,android-ndk,java-native-interface,Android,Cmake,Android Ndk,Java Native Interface,我重新安装了Android Studio,并将NDK和CMake升级到最新版本。之后我得到了这个错误: Error while executing process /home/wxh/Android/Sdk/cmake/3.6.4111459/bin/cmake with arguments {--build /home/wxh/AndroidStudioProjects/Measure_It/app/.externalNativeBuild/cmake/debug/armeabi-v7a --

我重新安装了Android Studio,并将NDK和CMake升级到最新版本。之后我得到了这个错误:

Error while executing process /home/wxh/Android/Sdk/cmake/3.6.4111459/bin/cmake with arguments {--build /home/wxh/AndroidStudioProjects/Measure_It/app/.externalNativeBuild/cmake/debug/armeabi-v7a --target removebackground}
[1/2] Building CXX object CMakeFiles/removebackground.dir/src/main/cpp/removebackground.cpp.o
[2/2] Linking CXX shared library 

error: undefined reference to 'cv::imwrite(cv::String const&, cv::_InputArray const&, std::__ndk1::vector<int, std::__ndk1::allocator<int> > const&)'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
  • 应用程序
    build.gradle

        DefaultConfig{externalNativeBuild {
        cmake { cppFlags "-frtti -fexceptions -std=c++11 "
            arguments '-DANDROID_STL=c++_shared'
            abiFilters 'armeabi-v7a'}}}
        externalNativeBuild { cmake { path "CMakeLists.txt"} }
    
  • 它与opencv无关,因为它没有被修改


  • 还有什么问题吗?

    OpenCV 3使用的是NDK中不再支持的gunstl。NDK的新版本只有
    c++\u static
    c++\u shared
    STL。您可以使用新版本的NDK从源代码中重建OpenCV 3.x,并选择一个受支持的STL选项,或者您可以使用OpenCV 4.x,它是随
    c++\u static
    预构建的


    修复代码以覆盖3.x和4.x之间的API差异可能比从源代码重建OpenCV更容易。

    可能的原因:新NDK->新编译器->它不同于用于编译OpenCV->OpenCV库的代码,您拥有的OpenCV库不再与编译器兼容。如果这是真的,那么你需要用你的新编译器重建OpenCV。祝贺你,这就是问题所在。通过下载android-ndk-r17c将ndk.dir=/address\u更改为/android-ndk-r17c将cmake参数更改为-DANDROID\u STL=gnustl\u static,问题就解决了。如果当前的代码能够正常工作,我不会进行总的升级,因为总的升级会导致大量错误。对不起,我没有把返回NDK r17列为一个简单的选择,因为你的问题是关于“升级NDK”的。我自己没有升级NDK,在Android工作室只有最新的一个。我很久以前就建立了我的OpenCV SDK,不记得我是怎么做的。我不认为有任何兼容的SDK用于下载,所以我会去降级NDK,除非有任何不利的方面要考虑。
        DefaultConfig{externalNativeBuild {
        cmake { cppFlags "-frtti -fexceptions -std=c++11 "
            arguments '-DANDROID_STL=c++_shared'
            abiFilters 'armeabi-v7a'}}}
        externalNativeBuild { cmake { path "CMakeLists.txt"} }