5

I'm trying to follow the tutorial at http://code.opencv.org/projects/opencv/wiki/Trunk_OpenCV_for_Android to build OpenCV 3.2.0 for Android from source. This is because eventually I want to customise the build, but for now I'm content to just be able to build it myself.

In accordance with the tutorial I'm running the following commands, which appear to complete successfully:

export ANDROID_NDK=~/my-android-ndk
export ANDROID_STANDALONE_TOOLCHAIN=~/my-android-toolchain
cd opencv/platforms
sh ./scripts/cmake_android_arm.sh
cd build_android_arm
make -j8

When I check the build_android_arm directory, I see a lot of things, including all the .a files I expect. However there seems to be one file missing: the libopencv_java.so which is the actual library loaded by the openCV static library manager (I'm not able to use the dynamic library manager). This file is present in the Android samples, and copying manually across to my project does work. But I would like to be able to build this file myself!

I've tried playing around with various CMake settings myself, but there are thousands of possible combinations of options and I'm not sure where to start.

What am I missing?

Output from the shell script:

    CMake Deprecation Warning at /Applications/CMake.app/Contents/share/cmake-3.8/Modules/CMakeForceCompiler.cmake:83 (message):
      The CMAKE_FORCE_CXX_COMPILER macro is deprecated.  Instead just set
      CMAKE_CXX_COMPILER and allow CMake to identify the compiler.
    Call Stack (most recent call first):
      /Users/me/AndroidStudioProjects/opencv-3.2.0/platforms/android/android.toolchain.cmake:1166 (CMAKE_FORCE_CXX_COMPILER)
      /Users/me/AndroidStudioProjects/opencv-3.2.0/platforms/build_android_arm/CMakeFiles/3.8.2/CMakeSystem.cmake:6 (include)
      /Users/me/AndroidStudioProjects/opencv-3.2.0/platforms/build_android_arm/CMakeFiles/CMakeTmp/CMakeLists.txt:3 (project)


    -- Performing Test C_HAS_MFPU_NEON - Success
    -- Assume that non-module dependency is available: z (for module opencv_core)
    CMake Warning at cmake/OpenCVDetectAndroidSDK.cmake:205 (message):
      Can not find any SDK target compatible with: 9 11

                           The project example-15-puzzle will not be build
    Call Stack (most recent call first):
      samples/android/15-puzzle/CMakeLists.txt:3 (add_android_project)


    CMake Warning at cmake/OpenCVDetectAndroidSDK.cmake:205 (message):
      Can not find any SDK target compatible with: 9 11

                           The project example-face-detection will not be build
    Call Stack (most recent call first):
      samples/android/face-detection/CMakeLists.txt:9 (add_android_project)


    CMake Warning at cmake/OpenCVDetectAndroidSDK.cmake:205 (message):
      Can not find any SDK target compatible with: 9 11

                           The project example-image-manipulations will not be build
    Call Stack (most recent call first):
      samples/android/image-manipulations/CMakeLists.txt:3 (add_android_project)


    CMake Warning at cmake/OpenCVDetectAndroidSDK.cmake:205 (message):
      Can not find any SDK target compatible with: 9 11

                           The project example-camera-calibration will not be build
    Call Stack (most recent call first):
      samples/android/camera-calibration/CMakeLists.txt:3 (add_android_project)


    CMake Warning at cmake/OpenCVDetectAndroidSDK.cmake:205 (message):
      Can not find any SDK target compatible with: 9 11

                           The project example-color-blob-detection will not be build
    Call Stack (most recent call first):
      samples/android/color-blob-detection/CMakeLists.txt:3 (add_android_project)


    CMake Warning at cmake/OpenCVDetectAndroidSDK.cmake:205 (message):
      Can not find any SDK target compatible with: 9 11

                           The project example-tutorial-1-camerapreview will not be build
    Call Stack (most recent call first):
      samples/android/tutorial-1-camerapreview/CMakeLists.txt:3 (add_android_project)


    CMake Warning at cmake/OpenCVDetectAndroidSDK.cmake:205 (message):
      Can not find any SDK target compatible with: 9 11

                           The project example-tutorial-2-mixedprocessing will not be build
    Call Stack (most recent call first):
      samples/android/tutorial-2-mixedprocessing/CMakeLists.txt:9 (add_android_project)


    CMake Warning at cmake/OpenCVDetectAndroidSDK.cmake:205 (message):
      Can not find any SDK target compatible with: 9 11

                           The project example-tutorial-3-cameracontrol will not be build
    Call Stack (most recent call first):
      samples/android/tutorial-3-cameracontrol/CMakeLists.txt:3 (add_android_project)


    -- Sample example-tutorial-4-opencl is disabled, because ANDROID_OPENCL_SDK is not specified
    -- 
    -- General configuration for OpenCV 3.2.0 =====================================
    --   Version control:               unknown
    -- 
    --   Platform:
    --     Timestamp:                   2017-06-16T18:53:59Z
    --     Host:                        Darwin 16.6.0 x86_64
    --     Target:                      Android 1 armv7-a
    --     CMake:                       3.8.2
    --     CMake generator:             Unix Makefiles
    --     CMake build tool:            /usr/bin/make
    --     Configuration:               Release
    -- 
    --   C/C++:
    --     Built as dynamic libs?:      NO
    --     C++ Compiler:                /Users/me/AndroidStudioProjects/android-ndk-r12b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++  (ver 4.9)
    --     C++ flags (Release):         -fexceptions -frtti -fpic -Wno-psabi --sysroot=/Users/me/AndroidStudioProjects/android-ndk-r12b/platforms/android-9/arch-arm -funwind-tables -finline-limit=64 -fsigned-char -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fdata-sections -ffunction-sections -Wa,--noexecstack    -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -fomit-frame-pointer -mfp16-format=ieee -fvisibility=hidden -fvisibility-inlines-hidden -mthumb -fomit-frame-pointer -fno-strict-aliasing -O3 -DNDEBUG  -DNDEBUG
    --     C++ flags (Debug):           -fexceptions -frtti -fpic -Wno-psabi --sysroot=/Users/me/AndroidStudioProjects/android-ndk-r12b/platforms/android-9/arch-arm -funwind-tables -finline-limit=64 -fsigned-char -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fdata-sections -ffunction-sections -Wa,--noexecstack    -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -fomit-frame-pointer -mfp16-format=ieee -fvisibility=hidden -fvisibility-inlines-hidden -marm -fno-omit-frame-pointer -fno-strict-aliasing -O0 -g -DDEBUG -D_DEBUG  -O0 -DDEBUG -D_DEBUG
    --     C Compiler:                  /Users/me/AndroidStudioProjects/android-ndk-r12b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc
    --     C flags (Release):           -fexceptions -fpic -Wno-psabi --sysroot=/Users/me/AndroidStudioProjects/android-ndk-r12b/platforms/android-9/arch-arm -funwind-tables -finline-limit=64 -fsigned-char -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fdata-sections -ffunction-sections -Wa,--noexecstack    -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wno-narrowing -Wno-comment -fdiagnostics-show-option -fomit-frame-pointer -mfp16-format=ieee -fvisibility=hidden -mthumb -fomit-frame-pointer -fno-strict-aliasing -O3 -DNDEBUG  -DNDEBUG
    --     C flags (Debug):             -fexceptions -fpic -Wno-psabi --sysroot=/Users/me/AndroidStudioProjects/android-ndk-r12b/platforms/android-9/arch-arm -funwind-tables -finline-limit=64 -fsigned-char -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fdata-sections -ffunction-sections -Wa,--noexecstack    -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wno-narrowing -Wno-comment -fdiagnostics-show-option -fomit-frame-pointer -mfp16-format=ieee -fvisibility=hidden -marm -fno-omit-frame-pointer -fno-strict-aliasing -O0 -g -DDEBUG -D_DEBUG  -O0 -DDEBUG -D_DEBUG
    --     Linker flags (Release):      -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,-allow-shlib-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now 
    --     Linker flags (Debug):        -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,-allow-shlib-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now 
    --     ccache:                      NO
    --     Precompiled headers:         NO
    --     Extra dependencies:          z dl m log
    --     3rdparty dependencies:       libjpeg libwebp libpng libtiff libjasper IlmImf tegra_hal
    -- 
    --   OpenCV modules:
    --     To be built:                 core flann imgproc ml photo video imgcodecs shape videoio highgui objdetect superres ts features2d calib3d stitching videostab
    --     Disabled:                    world
    --     Disabled by dependency:      -
    --     Unavailable:                 cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev java python2 viz
    -- 
    --   Android: 
    --     Android ABI:                 armeabi-v7a
    --     STL type:                    gnustl_static
    --     Native API level:            android-9
    --     SDK target:                  android_sdk_target_status-NOTFOUND
    --     Android NDK:                 /Users/me/AndroidStudioProjects/android-ndk-r12b (toolchain: arm-linux-androideabi-4.9)
    --     android tool:                NO
    --     Google Play manager:         NO
    --     Android examples:            NO
    -- 
    --   GUI: 
    --     GTK+:                        NO
    --     GThread :                    NO
    --     GtkGlExt:                    NO
    --     OpenGL support:              NO
    --     VTK support:                 NO
    -- 
    --   Media I/O: 
    --     ZLib:                        z (ver 1.2.3)
    --     JPEG:                        build (ver 90)
    --     WEBP:                        build (ver 0.3.1)
    --     PNG:                         build (ver 1.6.24)
    --     TIFF:                        build (ver 42 - 4.0.2)
    --     JPEG 2000:                   build (ver 1.900.1)
    --     OpenEXR:                     build (ver 1.7.1)
    --     GDAL:                        NO
    --     GDCM:                        NO
    -- 
    --   Video I/O:
    -- 
    --   Parallel framework:            pthreads
    -- 
    --   Other third-party libraries:
    --     Use IPP:                     NO
    --     Use Eigen:                   NO
    --     Use Cuda:                    NO
    --     Use OpenCL:                  NO
    --     Use OpenVX:                  NO
    --     Use custom HAL:              YES (carotene (ver 0.0.1))
    -- 
    --   Python 2:
    --     Interpreter:                 /usr/bin/python2.7 (ver 2.7.10)
    -- 
    --   Python 3:
    --     Interpreter:                 /usr/local/bin/python3 (ver 3.6.1)
    -- 
    --   Python (for build):            /usr/bin/python2.7
    -- 
    --   Java:
    --     ant:                         NO
    --     Java wrappers:               NO
    --     Java tests:                  NO
    -- 
    --   Matlab:                        NO
    -- 
    --   Documentation:
    --     Doxygen:                     NO
    -- 
    --   Tests and samples:
    --     Tests:                       YES
    --     Performance tests:           YES
    --     C/C++ Examples:              NO
    -- 
    --   Install path:                  /Users/me/AndroidStudioProjects/opencv-3.2.0/platforms/build_android_arm/install
    -- 
    --   cvconfig.h is in:              /Users/me/AndroidStudioProjects/opencv-3.2.0/platforms/build_android_arm
    -- -----------------------------------------------------------------
    -- 
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /Users/me/AndroidStudioProjects/opencv-3.2.0/platforms/build_android_arm

2 Answers 2

2

Thanks to a tip-off from https://zami0xzami.wordpress.com/2016/03/16/building-java-wrapper-for-opencv/ I figured the missing steps:

  1. I had no ANT executable, so I downloaded this from http://ant.apache.org/bindownload.cgi
  2. CMAKE was still not picking up the ANT executable, so I manually edited the flag ANT_EXECUTABLE to be a filepath to this, eg. /Users/me/apache-ant-1.10.1/bin/ant. I did this after configuring but before generating in CMAKE.
  3. I'm not sure whether it was required, but just for good measure I also set the following parameters manually:

    BUILD_FAT_JAVA_LIB: true (thanks ZdaR)
    BUILD_opencv_java: true
    JAVA_AWT_INCLUDE_PATH: /myJDKlocation/Contents/Home/include
    JAVA_AWT_LIBRARY: /myJDKlocation/Contents/Home/include/jawt.h
    JAVA_INCLUDE_PATH: /myJDKlocation/Contents/Home/include
    JAVA_INCLUDE_PATH2: /myJDKlocation/Contents/Home/include/darwin
    JAVA_JVM_LIBRARY: /myJDKlocation/Contents/Home/include/jni.h
    ANT_EXECUTABLE: /Users/me/apache-ant-1.10.1/bin/ant
    

The output from generate is now slightly different:

   Java:
      ant:                         /Users/me/apache-ant-1.10.1/bin/ant (ver 1.10.1)
      Java wrappers:               YES
      Java tests:                  NO

Now when I generate, make, and make install, I can see the libopencv_java3.so file in the lib directory. Happy days!

Sign up to request clarification or add additional context in comments.

Comments

1

While building OpenCV using scripts/cmake_android_arm.sh, the default behaviour defined in CMakeLists.txt is to build static libraries of all the modules, That's why you get .a files after running the .sh script, However if you want to build Shared Library (.so) file, then you need to force the cmake using the flag -DBUILD_FAT_JAVA_LIB=ON.

You need to edit the scripts/cmake_android_arm.sh as:

#!/bin/sh
cd `dirname $0`/..

mkdir -p build_android_arm
cd build_android_arm

cmake -DBUILD_FAT_JAVA_LIB=ON -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON -DCMAKE_TOOLCHAIN_FILE=../android/android.toolchain.cmake $@ ../..

5 Comments

I thought that could've been the key, but alas no change in the build output. I've added some additional output in my question in case there's some clue there?
I ran the same script on my machine with OpenCV 3.1.0 and it worked fine did you ran make -j8 after running the script ?
Yup, after which was about 20 minutes of lines like [ 0%] Building C object 3rdparty/libpng/CMakeFiles/libpng.dir/png.c.o
hmmmm ok, did the compilation successfully executed ?
It seems to, the make exits after 100% with no errors

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.