#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 и сторонней библиотеке, которая его использует.