libopencv_java3.so несоответствие между gcc и clang при использовании в Android NDK

#android #c #opencv #android-ndk

Вопрос:

Я создаю приложение на Android, в котором у меня есть собственный код (source.cpp) , который использует OpenCV3 (libopencv_java3.so) и сторонняя библиотека, связанная с этой библиотекой opencv (libusing_opencv.so). Библиотека opencv-это та, которая содержится в sdk для Android opencv, который вы можете скачать. Я составляю source.cpp в Android Studio используется ndk (версия 21.3) с cmake, который использует clang.

В моем source.cpp файл У меня нет проблем с использованием cv::Mat, cv::Rect и cv::Circle, но если я хочу использовать cv::imwrite, сборка завершается неудачно, и у меня есть неопределенная ошибка ссылки на cv::imwrite с ошибкой, упоминающей std::___ndk1vector. Поэтому я думаю, что это означает, что он компилируется с libc . Затем я попытался создать свой собственный libopencv_java3.so библиотека, использующая файл android.cmake и лязг. Похоже, это сработало. Когда я собрал source.cpp и связал мои построенные libopencv_java3.so библиотека У меня нет ошибок. Однако, когда я запустил приложение, мой libusing_opencv.so файл жаловался на неопределенную ссылку. Когда я проверил — в моей библиотеке, созданной opencv, не было этой ссылки, но в оригинальной библиотеке opencv она была. Я не могу перестроить стороннюю библиотеку, которая выглядит так, как будто она была создана с помощью gcc, и поэтому ей нужен оригинал libopencv_java3.so это также было построено с помощью gcc.

Есть ли в любом случае, что я могу заставить это работать, учитывая, что мой source.cpp используется ли libc (с clang), а две библиотеки используют libstdc ?

РЕШЕНИЕ: Я установил старую версию NDK — 17.2.4988734, последнюю версию до того, как поддержка GCC была удалена, и добавил в свою сборку следующие аргументы.gradle:

 externalNativeBuild {  cmake {  cppFlags "-std=c  11 -O3 -fsigned-char"  arguments '-DANDROID_TOOLCHAIN=gcc', '-DANDROID_STL=gnustl_static'  }  }  

Теперь libstdc связан, и мой скомпилированный исходный код соответствует библиотеке opencv3 и сторонней библиотеке, которая его использует.