Как собрать OpenCV 4.6.0 с opencv_contrib под Android на Windows
Мне нужно собрать OpenCV с доп.модулями под Android на Windows. Я делаю всё по этому гайду, но у меня не конфигурируется билд
Мой cmake:
cmake -GNinja -DCMAKE_MAKE_PROGRAM=c:/ninja/ninja -DCMAKE_INSTALL_PREFIX=E:/OpenCV-android -DANDROID_PROJECTS_BUILD_TYPE="ANT" -DBUILD_ANDROID_PROJECTS=ON -DBUILD_EXAMPLES=OFF -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_JAVA=ON -DBUILD_opencv_java=ON -DBUILD_SHARED_LIBS=OFF -DBUILD_FAT_JAVA_LIB=ON -DBUILD_PYTHON=OFF -DINSTALL_ANDROID_EXAMPLES=OFF -DANDROID_EXAMPLES_WITH_LIBS=OFF -DBUILD_DOCS=OFF -DWITH_OPENCL=ON -DANDROID_NDK_HOST_X64=ON -DANDROID_NDK=C:/Users/volce/AppData/Local/Android/Sdk/ndk/android-ndk-r25b/ -DANDROID_SDK=C:/Users/volce/AppData/Local/Android/Sdk -DCMAKE_TOOLCHAIN_FILE=C:/Users/volce/AppData/Local/Android/Sdk/ndk/android-ndk-r25b/build/cmake/android.toolchain.cmake -DANDROID_TOOLCHAIN=clang -DANDROID_STL=c++_static -DANDROID_ARM_NEON=ON -DANDROID_ABI=arm64-v8a -DANDROID_ABI=x86_64 -DANDROID_ABI=x86 -DANDROID_ABI=arm64-v8a -DANDROID_NDK_HOST_X64=ON -D BUILD_opencv_python3=OFF -D BUILD_opencv_python2=OFF -D OPENCV_EXTRA_MODULES_PATH=C:/OpenCV/opencv_contrib/modules -DOPENCV_ENABLE_NONFREE=ON -DANDROID_NATIVE_API_LEVEL=25 -DANDROID_SDK_TARGET=30 ..
Переменные в PATH:
Использую я Java 19
Ответы (2 шт):
Я нашёл два варианта:
- shell скрипт (взят отсюда)
- Устанавливаем Git Bash и прописываем в
PATH(C:\Program Files\Git\cmd) - Устанавливаем Cmake 3.24.3 и прописываем в
PATH(C:\Program Files\CMake\bin) - Устанавливаем java и прописываем в
PATH(C:\Program Files\Java\jdk1.8.0_202\bin), создаем переменнуюJAVA_HOME(C:\Program Files\Java\jdk1.8.0_202) - Устанавливаем C компилятор (mingw или Visual Studio и тп). Если вы будете использовать
mingw, то в нём нужно будет установить:mingw32-base-bin,mingw32-gcc-fortran-bin,mingw32-gcc-g++-bin,mingw32-gcc-objc-bin,msys-base-bin. А затем вPATHдобавитьC:\MinGW\bin - Также может понадобиться WSL под Windows, но у меня получилось и просто через Git Bash
- Создаём в пустой папке скрипт
build.sh:
#!/bin/bash -e
myRepo=$(pwd)
CMAKE_GENERATOR_OPTIONS=-G"Visual Studio 17 2022"
#CMAKE_GENERATOR_OPTIONS=-G"Visual Studio 15 2017 Win64"
#CMAKE_GENERATOR_OPTIONS=(-G"Visual Studio 16 2019" -A x64) # CMake 3.14+ is required
if [ ! -d "$myRepo/gstreamer" ]; then
echo "cloning gstreamer"
git clone https://github.com/GStreamer/gstreamer.git
else
cd gstreamer
git pull --rebase
cd ..
fi
if [ ! -d "$myRepo/openexr" ]; then
echo "cloning openexr"
git clone https://github.com/AcademySoftwareFoundation/openexr.git
else
cd openexr
git pull --rebase
cd ..
fi
if [ ! -d "$myRepo/openblas" ]; then
echo "cloning openblas"
git clone https://github.com/xianyi/OpenBLAS.git
else
cd openblas
git pull --rebase
cd ..
fi
if [ ! -d "$myRepo/eigen" ]; then
echo "cloning eigen"
git clone https://gitlab.com/libeigen/eigen.git
else
cd eigen
git pull --rebase
cd ..
fi
if [ ! -d "$myRepo/opencv" ]; then
echo "cloning opencv"
git clone https://github.com/opencv/opencv.git
else
cd opencv
git pull --rebase
cd ..
fi
if [ ! -d "$myRepo/opencv_contrib" ]; then
echo "cloning opencv_contrib"
git clone https://github.com/opencv/opencv_contrib.git
else
cd opencv_contrib
git pull --rebase
cd ..
fi
if [ ! -d "$myRepo/tesseract" ]; then
echo "cloning tesseract"
git clone https://github.com/tesseract-ocr/tesseract.git
else
cd tesseract
git pull --rebase
cd ..
fi
RepoSource=opencv
mkdir -p build_opencv
pushd build_opencv
CMAKE_OPTIONS=( -DBUILD_opencv_world:BOOL=OFF -DBUILD_JAVA:BOOL=ON -DBUILD_PERF_TESTS:BOOL=OFF -DBUILD_TESTS:BOOL=OFF -DBUILD_DOCS:BOOL=OFF -DWITH_CUDA:BOOL=OFF -DBUILD_EXAMPLES:BOOL=OFF -DINSTALL_CREATE_DISTRIB=ON)
set -x
cmake "${CMAKE_GENERATOR_OPTIONS[@]}" "${CMAKE_OPTIONS[@]}" -DOPENCV_EXTRA_MODULES_PATH="$myRepo"/opencv_contrib/modules -DCMAKE_INSTALL_PREFIX="$myRepo/install/$RepoSource" "$myRepo/$RepoSource"
echo "************************* $Source_DIR -->debug"
cmake --build . --config debug
echo "************************* $Source_DIR -->release"
cmake --build . --config release
cmake --build . --target install --config release
cmake --build . --target install --config debug
popd
Открываем Git Bash, открываем в нём папку с нашим скриптом и прописываем
bash build.shЕсли у вас ошибка
syntax error: unexpected end of file, то вот решениеНа выходе получаем opencv_java460.dll и opencv-460.jar
- cmake с ninja (взято отсюда, но доработано)
Тут я опишу то, что я использовал для сборки(не факт, что именно это всё нужно или конкретные версии, но на них у меня работало):
Устанавливаем Python и прописываем в
PATH(C:\Users\volce\AppData\Local\Programs\Python\Python311\Scripts\иC:\Users\volce\AppData\Local\Programs\Python\Python311\)Устанавливаем java 8 и прописываем в
PATHиJAVA_HOME(см. выше)Устанавливаем
Cmake 3.24.3(на другой версии не пробовал) и прописываем вPATH(см. выше)Скачать NDK r25, разархивировать и добавить переменную среды
ANDROID_NDK: C:\Users\volce\AppData\Local\Android\Sdk\ndk\android-ndk-r25bСкачиваем SDK tools r25.2.3, platform-tools r25.0.1 и build-tools r25.0.1
В папке с SDK заменяем содержимое папок
tools,build-toolsиplatform-toolsна скачанныеТакже, в PATH я добавил
C:\Users\volce\AppData\Local\Android\Sdk\toolsиC:\Users\volce\AppData\Local\Android\Sdk\platform-toolsДобавляем переменные среды:
ANDROID_HOMEиANDROID_SDK_ROOT, где указываем путь до SDK (например,C:\Users\volce\AppData\Local\Android\Sdk)Скачиваем ant и прописываем в
PATH(C:\apache-ant-1.10.12\binиC:\apache-ant-1.10.12\lib) и создаёмANT_HOME(C:\apache-ant-1.10.12)Скачиваем
MinGw, устанавливаем нужные пакеты и прописываем вPATH(см. выше)Скачиваем
Visual Studio
Что я делал дальше
Создал папку под всё это дело
В ней делаем
git clone https://github.com/opencv/opencv.gitиgit clone https://github.com/opencv/opencv_contrib.gitВ папке с
opencvпереходим вsamples\androidи в файлеCMakeLists.txtудаляемadd_subdirectory(15-puzzle)(из-за этого у меня не собиралось)Создаём в нашей корневой папке(которую создали под сборку) папку
buildЗаходим в неё и делаем
git clone https://github.com/ninja-build/ninja.gitОткрываем Visual Studio. В ней: Средства->Командная строка->Командная строка разработчика. В командной строке прописываем путь до созданной папки
buildи прописываемpython configure.py --bootstrap. Таким образом мы сконфигурировалиninjaНаходясь в нашей папке
buildв консоли прописываем следующее(не забудьте поменять пути на свои):
cmake -GNinja -DCMAKE_MAKE_PROGRAM=E:\OpenCV\build\ninja.exe -DCMAKE_INSTALL_PREFIX=E:\OpenCV\install -DANDROID_PROJECTS_BUILD_TYPE="ANT" -DBUILD_ANDROID_PROJECTS=ON -DBUILD_EXAMPLES:BOOL=OFF -DBUILD_TESTS:BOOL=OFF -DBUILD_PERF_TESTS:BOOL=OFF -DBUILD_JAVA=ON -DBUILD_opencv_java=ON -DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_FAT_JAVA_LIB=ON -DBUILD_PYTHON:BOOL=OFF -DINSTALL_ANDROID_EXAMPLES:BOOL=OFF -DANDROID_EXAMPLES_WITH_LIBS:BOOL=OFF -DBUILD_DOCS:BOOL=OFF -DWITH_OPENCL=ON -DANDROID_NDK_HOST_X64=ON -DANDROID_NDK=C:/Users/volce/AppData/Local/Android/Sdk/ndk/android-ndk-r25b/ -DANDROID_SDK=C:/Users/volce/AppData/Local/Android/Sdk -DCMAKE_TOOLCHAIN_FILE=C:/Users/volce/AppData/Local/Android/Sdk/ndk/android-ndk-r25b/build/cmake/android.toolchain.cmake -DANDROID_TOOLCHAIN=clang -DANDROID_STL=c++_static -DANDROID_ARM_NEON=ON -DANDROID_ABI='arm64-v8a, armeabi-v7a, x86_64, x86' -DANDROID_NDK_HOST_X64=ON -DBUILD_opencv_python3:BOOL=OFF -DBUILD_opencv_python2:BOOL=OFF -DOPENCV_EXTRA_MODULES_PATH=E:/OpenCV/opencv_contrib/modules -DOPENCV_ENABLE_NONFREE=ON -DANDROID_NATIVE_API_LEVEL=25 -DANDROID_TARGET_SDK_VERSION=32 -DANDROID_MIN_SDK_VERSION=21 E:\OpenCV\opencv
После выполнения прописываем
ninja -j8Дождавшись выполнения предыдущей команды, пишем
ninja installНа выходе получаем OpenCV SDK под Android
Как подключить OpenCV 4.6.0 в проект - тык
Ответ есть, но у меня другой путь (собирал при помощи Ninja + clang++ из тулчейна), вдруг кому пригодится :)
- Скачиваем исходники с https://github.com/opencv/opencv, https://github.com/opencv/opencv_contrib
- В проекте используется
Ninja- он шел в комплекте с Qt, возможно, придется ставить отдельно - Собирать все придется при помощи специального toolchain'а из NDK, обычно лежит в папке
<NDK_PATH>/build/cmake/android.toolchain.cmake - Создаем рядом папку, в которую будет собирать проект (запускаем из нее cmake для генерации проектных файлов):
- при использовании CMake GUI не получилось указать ABI, только дефолтный, но если все же получится - то выбирать в качестве генератора
Ninja-Specify toolchain file for cross-compilingи путь к тулчейну - Из консоли можно все сгенерировать одной командой (ниже)
- при использовании CMake GUI не получилось указать ABI, только дефолтный, но если все же получится - то выбирать в качестве генератора
- Собираем проект командой
ninja -j8 - Устанавливаем командой
ninja install
В команде ниже отключена большая часть библиотек, т.к. они не используются - соответственно, нужно внимательно проверить необходимые флаги (особенно -DBUILD_opencv_***). Еще команда очень длинная, так что аккуратнее с пробелами при копировании (еще ниже эта же команда в одну строчку под катом).
Здесь
D:\Development\opencv-4.5.0- исходники opencvD:\Development\opencv_contrib-4.5.0- исходники opencv-contribD:\Development\opencv_contrib-4.5.0_android_sdk- сюда собираем проект
Команда:
cmake -GNinja -DCMAKE_TOOLCHAIN_FILE=C:/Users/Alexey/AppData/Local/Android/Sdk/ndk/25.1.8937393/build/cmake/android.toolchain.cmake -DCMAKE_INSTALL_PREFIX=D:/Development/opencv_contrib-4.5.0_android_sdk/install -DBUILD_EXAMPLES:BOOL=OFF -DBUILD_TESTS:BOOL=OFF -DBUILD_PERF_TESTS:BOOL=OFF -DBUILD_JAVA=ON -DBUILD_opencv_java=ON -DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_FAT_JAVA_LIB=ON -DBUILD_PYTHON:BOOL=OFF -DANDROID_EXAMPLES_WITH_LIBS:BOOL=OFF -DBUILD_DOCS:BOOL=OFF -DWITH_OPENCL=ON -DANDROID_NDK_HOST_X64=ON -DBUILD_PROTOBUF:BOOL=OFF -DWITH_PROTOBUF:BOOL=OFF -DWITH_ADE:BOOL=OFF -DBUILD_opencv_dnn=OFF -DBUILD_opencv_dnn_objdetect=OFF -DBUILD_opencv_dnn_superres=OFF -DBUILD_opencv_dpm=OFF -DBUILD_opencv_datasets=OFF -DBUILD_opencv_optflow=OFF -DBUILD_opencv_stitching=OFF -DBUILD_opencv_stereo=OFF -DBUILD_opencv_tracking=OFF -DBUILD_opencv_ccalib=OFF -DBUILD_opencv_bioinspired=OFF -DBUILD_opencv_video=OFF -DBUILD_opencv_videoio=OFF -DBUILD_opencv_videostab=OFF -DBUILD_opencv_aruco=OFF -DBUILD_opencv_gapi=OFF -DWITH_OPENEXR=OFF -DWITH_CAROTENE=OFF -DBUILD_opencv_surface_matching=OFF -DBUILD_opencv_saliency=OFF -DBUILD_opencv_rgbd=OFF -DBUILD_opencv_xphoto=OFF -DBUILD_opencv_plot=OFF -DBUILD_opencv_rapid=OFF -DBUILD_opencv_xfeatures2d=OFF -DBUILD_opencv_highgui=OFF -DBUILD_opencv_xobjdetect=OFF -DANDROID_NDK=C:/Users/Alexey/AppData/Local/Android/Sdk/ndk/25.1.8937393 -DANDROID_SDK=C:/Users/Alexey/AppData/Local/Android/Sdk -DCMAKE_TOOLCHAIN_FILE=C:/Users/Alexey/AppData/Local/Android/Sdk/ndk/25.1.8937393/build/cmake/android.toolchain.cmake -DANDROID_TOOLCHAIN=clang -DANDROID_STL=c++_static -DANDROID_ARM_NEON=ON -DANDROID_NDK_HOST_X64=ON -DBUILD_opencv_python3:BOOL=OFF -DBUILD_opencv_python2:BOOL=OFF -DANDROID_ABI=arm64-v8a -DBUILD_ANDROID_PROJECTS=ON -DINSTALL_ANDROID_EXAMPLES:BOOL=OFF -DOPENCV_EXTRA_MODULES_PATH=D:/Development/opencv_contrib-4.5.0/modules -DOPENCV_ENABLE_NONFREE=OFF -DANDROID_TARGET_SDK_VERSION=32 -DANDROID_MIN_SDK_VERSION=24 -DBUILD_ZLIB=ON D:/Development/opencv-4.5.0
Она же:
cmake -GNinja -DCMAKE_TOOLCHAIN_FILE=C:/Users/Alexey/AppData/Local/Android/Sdk/ndk/25.1.8937393/build/cmake/android.toolchain.cmake -DCMAKE_INSTALL_PREFIX=D:/Development/opencv_contrib-4.5.0_android_sdk/install -DBUILD_EXAMPLES:BOOL=OFF -DBUILD_TESTS:BOOL=OFF -DBUILD_PERF_TESTS:BOOL=OFF -DBUILD_JAVA=ON -DBUILD_opencv_java=ON -DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_FAT_JAVA_LIB=ON -DBUILD_PYTHON:BOOL=OFF -DANDROID_EXAMPLES_WITH_LIBS:BOOL=OFF -DBUILD_DOCS:BOOL=OFF -DWITH_OPENCL=ON -DANDROID_NDK_HOST_X64=ON -DBUILD_PROTOBUF:BOOL=OFF -DWITH_PROTOBUF:BOOL=OFF -DWITH_ADE:BOOL=OFF -DBUILD_opencv_dnn=OFF -DBUILD_opencv_dnn_objdetect=OFF -DBUILD_opencv_dnn_superres=OFF -DBUILD_opencv_dpm=OFF -DBUILD_opencv_datasets=OFF -DBUILD_opencv_optflow=OFF -DBUILD_opencv_stitching=OFF -DBUILD_opencv_stereo=OFF -DBUILD_opencv_tracking=OFF -DBUILD_opencv_ccalib=OFF -DBUILD_opencv_bioinspired=OFF -DBUILD_opencv_video=OFF -DBUILD_opencv_videoio=OFF -DBUILD_opencv_videostab=OFF -DBUILD_opencv_aruco=OFF -DBUILD_opencv_gapi=OFF -DWITH_OPENEXR=OFF -DWITH_CAROTENE=OFF -DBUILD_opencv_surface_matching=OFF -DBUILD_opencv_saliency=OFF -DBUILD_opencv_rgbd=OFF -DBUILD_opencv_xphoto=OFF -DBUILD_opencv_plot=OFF -DBUILD_opencv_rapid=OFF -DBUILD_opencv_xfeatures2d=OFF -DBUILD_opencv_highgui=OFF -DBUILD_opencv_xobjdetect=OFF -DANDROID_NDK=C:/Users/Alexey/AppData/Local/Android/Sdk/ndk/25.1.8937393 -DANDROID_SDK=C:/Users/Alexey/AppData/Local/Android/Sdk -DCMAKE_TOOLCHAIN_FILE=C:/Users/Alexey/AppData/Local/Android/Sdk/ndk/25.1.8937393/build/cmake/android.toolchain.cmake -DANDROID_TOOLCHAIN=clang -DANDROID_STL=c++_static -DANDROID_ARM_NEON=ON -DANDROID_NDK_HOST_X64=ON -DBUILD_opencv_python3:BOOL=OFF -DBUILD_opencv_python2:BOOL=OFF -DANDROID_ABI=arm64-v8a -DBUILD_ANDROID_PROJECTS=ON -DINSTALL_ANDROID_EXAMPLES:BOOL=OFF -DOPENCV_EXTRA_MODULES_PATH=D:/Development/opencv_contrib-4.5.0/modules -DOPENCV_ENABLE_NONFREE=OFF -DANDROID_TARGET_SDK_VERSION=32 -DANDROID_MIN_SDK_VERSION=24 -DBUILD_ZLIB=ON D:/Development/opencv-4.5.0
Важно:
- Для использования contrib нужно указать флаг
-DOPENCV_EXTRA_MODULES_PATH=<opencv_contrib>/modules - Сразу для всех ABI сгенерировать SDK не вышло, поэтому для каждого ABI (arm64-v8a, armeabi-v7a, x86_64, x86) придется все генерировать с нуля, т.е. несколько раз проворачивать всю процедуру с разными значениями
-DANDROID_ABIи собирать полученные файлы в один общий SDK libopencv_java4.soгенерируется в папкеjniв корне только с флагом-DBUILD_ANDROID_PROJECTS=ON, но в зависимости от системы с этим флагом могут возникнуть проблемы на финальной сборке черезninja- у меня ругался на NDK, пришлось хитрить и то отключать, то включать обратно его (с-DBUILD_ANDROID_PROJECTS=OFFвсе собралось с ходу)- Флаг
-DBUILD_ZLIB=ONнужен, без него не линкуется на каком-то этапе
P.S.
Для универсальности также пришлось отредактировать финальный build.gradle, исправив блок sourceSets:
sourceSets {
main {
jniLibs.srcDirs = ['../../jni']
java.srcDirs = ['src'] // TODO Use original files instead of copied into build directory
aidl.srcDirs = ['src']
res.srcDirs = ['D:/Development/opencv-4.5.0/modules/java/android_sdk/android_gradle_lib/res']
manifest.srcFile 'AndroidManifest.xml'
}
}
на другие значения, которые используются в официальной сборке android-sdk:
sourceSets {
main {
jniLibs.srcDirs = ['native/libs']
java.srcDirs = ['java/src']
aidl.srcDirs = ['java/src']
res.srcDirs = ['java/res']
manifest.srcFile 'java/AndroidManifest.xml'
}
}

