ошибка: неопределенная ссылка в функции JNI После обновления NDK и Cmake для Android Studio - PullRequest
1 голос
/ 18 мая 2019

Я переустановил 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)

Код прекрасно компилируется, поэтому в этом нет опечаток.Для двойной проверки:

  1. imgproc.hpp было включено.
  2. CMakeList.txt имеет включенный путь и путь к библиотеке:

    include_directories(/home/wxh/Android/opencv_sdk/native/jni/include)
    add_library( lib_opencv SHARED IMPORTED )
    set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION /home/wxh/Android/opencv_sdk/native/libs/${ANDROID_ABI}/libopencv_java3.so)
    
  3. приложение build.gradle имеет

        DefaultConfig{externalNativeBuild {
        cmake { cppFlags "-frtti -fexceptions -std=c++11 "
            arguments '-DANDROID_STL=c++_shared'
            abiFilters 'armeabi-v7a'}}}
        externalNativeBuild { cmake { path "CMakeLists.txt"} }
    
  4. Это не имеет ничего общего с opencv, поскольку оно не было изменено.

Что еще может быть не так ???

1 Ответ

1 голос
/ 18 мая 2019

OpenCV 3 использовал gunstl, который больше не поддерживается в NDK. Новые выпуски NDK имеют только c++_static и c++_shared STL. Вы можете пересобрать OpenCV 3.x из источников с новым выпуском NDK и выбрать один из поддерживаемых параметров STL, или вы можете использовать OpenCV 4.x, который поставляется с предустановленным c++_static.

Может быть проще исправить код, чтобы покрыть различия API между 3.x и 4.x, чем перестраивать OpenCV из исходных кодов.

...