0
votes

I am trying for over one week to compile OpenCV 3.1.0 for Android with NDK r18 on Ubuntu 18.04.

I have used the following command:

cmake -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \
  -DANDROID_NDK="/home/qamaruddin/Downloads/android-ndk-r18-linux-x86_64/android-ndk-r18/" \
  -DCMAKE_TOOLCHAIN_FILE="/home/qamaruddin/Downloads/android-ndk-r18-linux-x86_64/android-ndk-r18/build/cmake/android.toolchain.cmake" \
  -DANDROID_NATIVE_API_LEVEL=19 \
  -DANDROID_ABI="armeabi-v7a" \
  -DWITH_CUDA=OFF \
  -DWITH_MATLAB=OFF \
  -DBUILD_ANDROID_EXAMPLES=OFF \
  -DBUILD_DOCS=OFF \
  -DBUILD_PERF_TESTS=OFF \
  -DBUILD_TESTS=OFF \
  -DCMAKE_CXX_COMPILER=/usr/bin/clang++ \
  -DCMAKE_C_COMPILER=/usr/bin/clang \
  -DOPENCV_EXTRA_MODULES_PATH="/opt/opencv_contrib/modules/"  \
  -DCMAKE_INSTALL_PREFIX:PATH="/home/mig-ocv/ocv-android-310/" \
  -DEXECUTABLE_OUTPUT_PATH:PATH="/home/mig-ocv/ocv-android-310/" \
  -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH="/home/mig-ocv/ocv-android-310/" \
  -DCMAKE_BUILD_TYPE=Release \
  /opt/opencv

Follwed by make & make install/strip.

I have tried different versions of OpenCV 3 such as 3.1.0, 3.4.3, and 3.4.0. I have also tried NDKr15c, NDKr17c, and NDKr18c.

I have tried the following variations:

  1. Change NDK version
  2. Change OpenCV 3 version
  3. Install using python script located at opencv/platforms/androind/setup.py
  4. Build using CMAKE
  5. Use Ninja for CMAKE, but this gives the error: "ninja: error: loading 'build/build.global.ninja': No such file or directory"
  6. Install without Ninja with CMAKE

At the moment, using the above-posted command for CMAKE builds successfully, but I can't change the target install dir since it always builds into /usr/local/ and when I inspect the target directory it does not have the familiar OpenCV for Android structure which is:

1- etc 2- java 3- native --> jni --> include

I wonder what is wrong in my process that makes it so difficult to build OpenCV 3 from source for Android with OpenCV Contrib.

Note that $ANDROID_HOME is set to the android SDKs directory on my system and $ANDROID_NDK is also set.

I have seen all duplicate questions on StackOverflow and other forums, but none seems to work in my case.

When I try to build with Ninja with this command:

cmake -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \
  -DANDROID_NDK="$HOME/Downloads/android-ndk-r17b/" \
  -DCMAKE_TOOLCHAIN_FILE="$HOME/Downloads/android-ndk-r17b/build/cmake/android.toolchain.cmake" \
  -DANDROID_NATIVE_API_LEVEL=21 \
  -DANDROID_ABI="armeabi-v7a" \
  -DWITH_CUDA=OFF \
  -DWITH_MATLAB=OFF \
  -DBUILD_ANDROID_EXAMPLES=OFF \
  -DBUILD_DOCS=OFF \
  -DBUILD_PERF_TESTS=OFF \
  -DBUILD_TESTS=OFF \
  -DCMAKE_CXX_COMPILER=/usr/bin/clang++ \
  -DCMAKE_C_COMPILER=/usr/bin/clang \
  -DOPENCV_EXTRA_MODULES_PATH="$HOME/ocv/opencv_contrib/modules/"  \
  -DCMAKE_INSTALL_PREFIX:PATH="$HOME/agusta/ocv-android-310/" \
  -DEXECUTABLE_OUTPUT_PATH:PATH="$HOME/agusta/ocv-android-310/" \
  -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH="$HOME/agusta/ocv-android-310/" \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_MAKE_PROGRAM=/usr/bin/ninja \
  $HOME/ocv/opencv

I get:

CMake Deprecation Warning at CMakeLists.txt:72 (cmake_policy):


The OLD behavior for policy CMP0022 will be removed from a future version
  of CMake.

  The cmake-policies(7) manual explains that the OLD behaviors of all
  policies are deprecated and that a policy should be set to OLD only under
  specific short-term circumstances.  Projects should be ported to the NEW
  behavior and not rely on setting a policy to OLD.


CMake Deprecation Warning at CMakeLists.txt:77 (cmake_policy):
  The OLD behavior for policy CMP0026 will be removed from a future version
  of CMake.

  The cmake-policies(7) manual explains that the OLD behaviors of all
  policies are deprecated and that a policy should be set to OLD only under
  specific short-term circumstances.  Projects should be ported to the NEW
  behavior and not rely on setting a policy to OLD.


CMake Deprecation Warning at CMakeLists.txt:82 (cmake_policy):
  The OLD behavior for policy CMP0042 will be removed from a future version
  of CMake.

  The cmake-policies(7) manual explains that the OLD behaviors of all
  policies are deprecated and that a policy should be set to OLD only under
  specific short-term circumstances.  Projects should be ported to the NEW
  behavior and not rely on setting a policy to OLD.


-- Check for working CXX compiler: /home/qamaruddin/Downloads/android-ndk-r17b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++
CMake Error: Generator: execution of make failed. Make command was: "/usr/bin/ninja" "cmTC_c4cee/fast"
-- Check for working CXX compiler: /home/qamaruddin/Downloads/android-ndk-r17b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ -- broken
CMake Error at /usr/local/share/cmake-3.12/Modules/CMakeTestCXXCompiler.cmake:45 (message):
  The C++ compiler

    "/home/qamaruddin/Downloads/android-ndk-r17b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++"

  is not able to compile a simple test program.

  It fails with the following output:

    Change Dir: /home/qamaruddin/agusta/temp/CMakeFiles/CMakeTmp

    Run Build Command:"/usr/bin/ninja" "cmTC_c4cee/fast"
    No such file or directory
    Generator: execution of make failed. Make command was: "/usr/bin/ninja" "cmTC_c4cee/fast"




  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt:93 (project)


-- Configuring incomplete, errors occurred!
See also "/home/qamaruddin/agusta/temp/CMakeFiles/CMakeOutput.log".
See also "/home/qamaruddin/agusta/temp/CMakeFiles/CMakeError.log".
You have changed variables that require your cache to be deleted.
Configure will be re-run and you may have to reset some variables.
The following variables have changed:
CMAKE_CXX_COMPILER= /usr/bin/clang++
CMAKE_C_COMPILER= /usr/bin/clang

-- Generating done
CMake Warning:
  Manually-specified variables were not used by the project:

    BUILD_ANDROID_EXAMPLES
    BUILD_DOCS
    BUILD_PERF_TESTS
    BUILD_TESTS
    EXECUTABLE_OUTPUT_PATH
    OPENCV_EXTRA_MODULES_PATH
    WITH_CUDA
    WITH_MATLAB


-- Build files have been written to: /home/qamaruddin/agusta/temp
1
There are a build script and readme regarding building opencv for android in opencv repository. Note that it has changed for latest versions, here you can find it for 3.1Dmitrii Z.
Thank you for your reply, but I have tried exactly the same link as follows: # export CMAKE_MAKE_PROGRAM=/usr/bin/ninja # export CMAKE_CXX_COMPILER=/usr/bin/clang++ # export CMAKE_C_COMPILER=clang # ./build_sdk.py --ndk_path /home/qamaruddin/Downloads/android-ndk-r17c-linux-x86_64/android-ndk-r17c/ --sdk_path /home/qamaruddin/android-sdks --extra_pack 3.0.1:/opt/opencv_contrib/modules /opt/opencv/build /opt/opencv I get this error:Mustafa Qamaruddin
` To configure the toolchain set CMake variable ANDROID_TOOLCHAIN_NAME to one of the following values: * aarch64-linux-android-4.9 * arm-linux-androideabi-4.9 * x86-4.9 * x86_64-4.9 CMake Error: CMake was unable to find a build program corresponding to "Ninja". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool. CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage `Mustafa Qamaruddin
CMake Error at platforms/android/android.toolchain.cmake:617 (message): Could not find any working toolchain in the NDK. Probably your Android NDK is broken. Call Stack (most recent call first): /usr/share/cmake-3.10/Modules/CMakeDetermineSystem.cmake:94 (include) CMakeLists.txt:93 (project) Mustafa Qamaruddin
` CMake Error: CMake was unable to find a build program corresponding to "Ninja". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool. `Mustafa Qamaruddin

1 Answers

0
votes

I have managed to get it to work, basically, OCV didn't support NDKr18, and I also had to install ninja from source. I have also used python3 instead of python2 to run the opencv/platforms/android/build_sdk.py . One more thing is that I use Eclipse Android ADT which Google has for no reason deprecated ;(, but I find it super fast compared to the heavy Android Studio.

# export ANDROID_ABI=armeabi-v7a
# export ANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.8
# export ANDROID_NDK=$HOME/Downloads/android-ndk-r17c-linux-x86_64/android-ndk-r17c/
# export ANDROID_SDK=$HOME/android-sdks/

./../opencv/platforms/android/build_sdk.py --extra_modules_path=/opt/opencv_contrib/modules --config ../opencv/platforms/android/ndk-17.config.py