맥에서 OpenCV를 안드로이드 NDK 툴체인을 사용해서 빌드해 보기로 했다. 


1. 빌드 환경


빌드 환경은 아래와 같다. 다만, Java 같은 경우에는 brew cask로 설치하면 안된다. brew를 사용할 경우, JDK 10 이상의 최신 버전이 설치 되게 되는데, Android의 빌드툴인 Gradle 과 호환성 문제가 발생한다. 찾아보니, Gradle도 Gradle과 Gradle Wrapper의 두가지 버전이 존재하는데, Gradle 버전이 5.X 이상으로 높다고 하더라도 OpenCV 빌드시, 사용하는 Gradle Wrapper의 버전이 4.X로 낮게되면, JDK 10 이상의 환경을 지원하지 않는다고 한다. 따로 업데이트하는 방법도 존재하나, 몇번 시도해보고 안되서 최신버전으로 설치한 JDK 를 지우고,  Oracle 사이트에서 JDK8을 별도로 설치하였다. 참고로 했던, Java Wrapper로 ANT를 사용하기도 하는데, 최신 SDK에서는 더이상 지원하지도 않고, Gradle로 해도 별 무리없이 빌드되기 때문에, 따로 ANT를 설치하지는 않는다.

  • macOS Mojave 10.14.3
  • Android Studio 3.3.2,
  • Android SDK 28
  • Android NDK 19
  • Java JDK 8
  • CMake

위의 환경만 구축되어 있다면, NDK에서 제공하는 툴체인을 사용해서, 빌드하면 된다. 기본적으로 C++ 형태의 include 와 static lib.를 만들수 있다. 여기에다 Android Studio에서 사용하기 편하게 java로 wrapping하는 작업을 하게 되는데, 이를 위해서 Android SDK와 Java JDK가 필요하고, 이 작업을 Gradle이 수행하게 된다. 이 결과까지 나오면, 우리가 보통 사용하는 빌드된  OpenCV의 Android향 라이브러리를 볼 수 있다. 


2.CMake 기본 빌드 확인

OpenCV 홈페이지에서 source로된 openCV를 다운받는다. 적당한 디렉토리에 압축을 풀고, build 디렉토리를 만든 후에 바로 cmake 를 하면 된다. 이 경우에는 macOS용 툴체인으로 빌드되게 되고, make 까지해서, lib. 가 생성되면, macOS안에서 사용할수 있는 openCV 라이브러리가 만들어진다. 안드로이드향 openCV를 만드는게 목적이기 때문에 여기에서는 cmake가 잘먹는지 정도만 확인한다. 

-- General configuration for OpenCV 4.0.1 =====================================
--   Version control:               unknown
--
--   Platform:
--     Timestamp:                   2019-03-16T10:53:51Z
--     Host:                        Darwin 18.2.0 x86_64
--     CMake:                       3.13.4
--     CMake generator:             Unix Makefiles
--     CMake build tool:            /usr/bin/make
--     Configuration:               Release
--
--   CPU/HW features:
--     Baseline:                    SSE SSE2 SSE3 SSSE3 SSE4_1
--       requested:                 DETECT
--     Dispatched code generation:  SSE4_2 FP16 AVX AVX2 AVX512_SKX
--       requested:                 SSE4_1 SSE4_2 AVX FP16 AVX2 AVX512_SKX
--       SSE4_2 (2 files):          + POPCNT SSE4_2
--       FP16 (1 files):            + POPCNT SSE4_2 FP16 AVX
--       AVX (5 files):             + POPCNT SSE4_2 AVX
--       AVX2 (13 files):           + POPCNT SSE4_2 FP16 FMA3 AVX AVX2
--       AVX512_SKX (1 files):      + POPCNT SSE4_2 FP16 FMA3 AVX AVX2 AVX_512F AVX512_SKX
--
--   C/C++:
--     Built as dynamic libs?:      YES
--     C++ Compiler:                /Library/Developer/CommandLineTools/usr/bin/c++  (ver 10.0.0.10001044)
--     C++ flags (Release):         -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 -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-unnamed-type-template-args -Wno-comment -fdiagnostics-show-option -Wno-long-long -Qunused-arguments -Wno-semicolon-before-method-body -ffunction-sections -fdata-sections  -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG  -DNDEBUG
--     C++ flags (Debug):           -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 -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-unnamed-type-template-args -Wno-comment -fdiagnostics-show-option -Wno-long-long -Qunused-arguments -Wno-semicolon-before-method-body -ffunction-sections -fdata-sections  -fvisibility=hidden -fvisibility-inlines-hidden -g  -O0 -DDEBUG -D_DEBUG
--     C Compiler:                  /Library/Developer/CommandLineTools/usr/bin/cc
--     C flags (Release):           -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 -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-unnamed-type-template-args -Wno-comment -fdiagnostics-show-option -Wno-long-long -Qunused-arguments -Wno-semicolon-before-method-body -ffunction-sections -fdata-sections  -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG  -DNDEBUG
--     C flags (Debug):             -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 -Wsign-promo -Wuninitialized -Winit-self -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-unnamed-type-template-args -Wno-comment -fdiagnostics-show-option -Wno-long-long -Qunused-arguments -Wno-semicolon-before-method-body -ffunction-sections -fdata-sections  -fvisibility=hidden -fvisibility-inlines-hidden -g  -O0 -DDEBUG -D_DEBUG
--     Linker flags (Release):
--     Linker flags (Debug):
--     ccache:                      NO
--     Precompiled headers:         NO
--     Extra dependencies:
--     3rdparty dependencies:
--
--   OpenCV modules:
--     To be built:                 calib3d core dnn features2d flann gapi highgui imgcodecs imgproc java_bindings_generator ml objdetect photo python2 python_bindings_generator stitching ts video videoio
--     Disabled:                    world
--     Disabled by dependency:      -
--     Unavailable:                 java js python3
--     Applications:                tests perf_tests apps
--     Documentation:               NO
--     Non-free algorithms:         NO
--
--   GUI:
--     Cocoa:                       YES
--     VTK support:                 NO
--
--   Media I/O:
--     ZLib:                        build (ver 1.2.11)
--     JPEG:                        build-libjpeg-turbo (ver 1.5.3-62)
--     WEBP:                        build (ver encoder: 0x020e)
--     PNG:                         build (ver 1.6.35)
--     TIFF:                        build (ver 42 - 4.0.9)
--     JPEG 2000:                   build (ver 1.900.1)
--     OpenEXR:                     build (ver 1.7.1)
--     HDR:                         YES
--     SUNRASTER:                   YES
--     PXM:                         YES
--     PFM:                         YES
--
--   Video I/O:
--     DC1394:                      NO
--     FFMPEG:                      NO
--       avcodec:                   NO
--       avformat:                  NO
--       avutil:                    NO
--       swscale:                   NO
--       avresample:                NO
--     GStreamer:                   NO
--     AVFoundation:                YES
--
--   Parallel framework:            GCD
--
--   Trace:                         YES (with Intel ITT)
--
--   Other third-party libraries:
--     Intel IPP:                   2019.0.0 Gold [2019.0.0]
--            at:                   /Users/injookim/Project/opencv-4.0.1/.build/Release/3rdparty/ippicv/ippicv_mac/icv
--     Intel IPP IW:                sources (2019.0.0)
--               at:                /Users/injookim/Project/opencv-4.0.1/.build/Release/3rdparty/ippicv/ippicv_mac/iw
--     Lapack:                      YES (/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Accelerate.framework /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Accelerate.framework)
--     Eigen:                       NO
--     Custom HAL:                  NO
--     Protobuf:                    build (3.5.1)
--
--   OpenCL:                        YES (no extra features)
--     Include path:                NO
--     Link libraries:              -framework OpenCL
--
--   Python 2:
--     Interpreter:                 /usr/bin/python2.7 (ver 2.7.10)
--     Libraries:                   /usr/lib/libpython2.7.dylib (ver 2.7.10)
--     numpy:                       /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/core/include (ver 1.8.0rc1)
--     install path:                lib/python2.7/site-packages/cv2/python-2.7
--
--   Python (for build):            /usr/bin/python2.7
--
--   Java:
--     ant:                         NO
--     JNI:                         /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/JavaVM.framework/Headers /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/JavaVM.framework/Headers /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/JavaVM.framework/Headers
--     Java wrappers:               NO
--     Java tests:                  NO
--
--   Install to:                    /usr/local
-- -----------------------------------------------------------------
--
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/injookim/Project/opencv-4.0.1/.build/Release
 Configuring done. Generating done. 이 뜬걸로 보아, cmake가 잘되었음을 확인할 수 있다.


3.안드로이드용 CMake 

안드로이드 용으로 빌드하려면, 여러가지 옵션이 필요하기 때문에 간단히,  아래와 같이 script 파일을 만들어서 이를 활용한다. NDK 디렉토리, SDK 디렉토리, OpenCV source가 있는 디렉토리, OpenCV lib.를 인스톨할 디렉토리, SDK API 레벨, 툴체인이 있는 디렉토리, 대상 Android Machine의 Architecture까지 설정해 주면 된다.

툴체인이 있는 디렉토리를 보면,  NDK에서 사전설정된 android toolchain을 사용하고 있음을 확인할 수 있다. Architecture의 경우에는 32bit를 사용하면, armeabi-v7a, 64bit를 사용하면 arm64-v8a를 선택하면 된다.

SDK_ROOT="/Users/injookim/Library/Android/sdk"
NDK_ROOT="~/Library/Android/sdk/ndk-bundle"
WD="/Users/injookim/Project"
OPENCV_ROOT="${WD}/opencv-4.0.1"
INSTALL_DIR="${WD}/android_opencv/opencv"
API_LEVEL=28
TOOLCHAIN="~/Library/Android/sdk/ndk-bundle/build/cmake/android.toolchain.cmake"
#ARCH="arm64-v8a"
ARCH="armeabi-v7a"
cmake  ../.. \
-DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \
-DANDROID_SDK="$SDK_ROOT" \
-DCMAKE_TOOLCHAIN_FILE="${TOOLCHAIN}" \
-DANDROID_NDK="${NDK_ROOT}" \
-DANDROID_SDK_TARGET="${API_LEVEL}" \
-DANDROID_ABI="${ARCH}" \
-DBUILD_EXAMPLES=OFF \
-DBUILD_ANDROID_PROJECTS=ON \
-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=OFF \
-DANDROID_NDK_HOST_X64=ON \ 
-DANDROID_TOOLCHAIN=clang \
-DANDROID_STL=c++_static \
-DANDROID_ARM_NEON=ON \
-DANDROID_NDK_HOST_X64=ON


SDK 폴더를 지정할 때는,  full path를 사용해 주는 게 필요하다. 그러하지 않을 경우, 지정 위치를 찾지 못하며, 아래와 같은 error message가 나타난다.

CMake Error at cmake/android/OpenCVDetectAndroidSDK.cmake:51 (message):
  Android SDK: specified path doesn't exist: ~/Library/Android/sdk
Call Stack (most recent call first):
  cmake/android/OpenCVDetectAndroidSDK.cmake:171 (ocv_detect_android_sdk)
  CMakeLists.txt:780 (include)

cmake가 잘 되었을 경우에는 아래와 같은 메시지가 나오게 된다.

-- General configuration for OpenCV 4.0.1 =====================================
--   Version control:               unknown
--
--   Platform:
--     Timestamp:                   2019-03-17T11:14:56Z
--     Host:                        Darwin 18.2.0 x86_64
--     Target:                      Android 1 armv7-a
--     CMake:                       3.13.4
--     CMake generator:             Unix Makefiles
--     CMake build tool:            /usr/bin/make
--     Configuration:               Release
--
--   CPU/HW features:
--     Baseline:                    NEON
--       requested:                 DETECT
--
--   C/C++:
--     Built as dynamic libs?:      NO
--     C++ Compiler:                /Users/injookim/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++  (ver 8.0)
--     C++ flags (Release):         -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mfpu=vfpv3-d16 -fno-addrsig -march=armv7-a -mthumb -mfpu=neon -Wa,--noexecstack -Wformat -Werror=format-security -stdlib=libc++    -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 -Wsign-promo -Wuninitialized -Winit-self -Winconsistent-missing-override -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-unnamed-type-template-args -Wno-comment -fdiagnostics-show-option -Qunused-arguments  -fvisibility=hidden -fvisibility-inlines-hidden  -Oz -DNDEBUG   -DNDEBUG
--     C++ flags (Debug):           -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mfpu=vfpv3-d16 -fno-addrsig -march=armv7-a -mthumb -mfpu=neon -Wa,--noexecstack -Wformat -Werror=format-security -stdlib=libc++    -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 -Wsign-promo -Wuninitialized -Winit-self -Winconsistent-missing-override -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-unnamed-type-template-args -Wno-comment -fdiagnostics-show-option -Qunused-arguments  -fvisibility=hidden -fvisibility-inlines-hidden  -O0 -fno-limit-debug-info   -DDEBUG -D_DEBUG -g
--     C Compiler:                  /Users/injookim/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang
--     C flags (Release):           -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mfpu=vfpv3-d16 -fno-addrsig -march=armv7-a -mthumb -mfpu=neon -Wa,--noexecstack -Wformat -Werror=format-security    -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 -Wsign-promo -Wuninitialized -Winit-self -Winconsistent-missing-override -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-unnamed-type-template-args -Wno-comment -fdiagnostics-show-option -Qunused-arguments  -fvisibility=hidden -fvisibility-inlines-hidden  -Oz -DNDEBUG   -DNDEBUG
--     C flags (Debug):             -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mfpu=vfpv3-d16 -fno-addrsig -march=armv7-a -mthumb -mfpu=neon -Wa,--noexecstack -Wformat -Werror=format-security    -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 -Wsign-promo -Wuninitialized -Winit-self -Winconsistent-missing-override -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-unnamed-type-template-args -Wno-comment -fdiagnostics-show-option -Qunused-arguments  -fvisibility=hidden -fvisibility-inlines-hidden  -O0 -fno-limit-debug-info   -DDEBUG -D_DEBUG -g
--     Linker flags (Release):      -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now
--     Linker flags (Debug):        -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now
--     ccache:                      NO
--     Precompiled headers:         NO
--     Extra dependencies:          /Users/injookim/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/libz.a dl m log
--     3rdparty dependencies:       libcpufeatures libprotobuf libjpeg-turbo libwebp libpng libtiff libjasper IlmImf quirc tegra_hal
--
--   OpenCV modules:
--     To be built:                 calib3d core dnn features2d flann highgui imgcodecs imgproc java java_bindings_generator ml objdetect photo stitching video videoio
--     Disabled:                    world
--     Disabled by dependency:      -
--     Unavailable:                 gapi js python2 python3 ts
--     Applications:                -
--     Documentation:               NO
--     Non-free algorithms:         NO
--
--   Android NDK:                   /Users/injookim/Library/Android/sdk/ndk-bundle (ver 19.1.5304403)
--     Android ABI:                 armeabi-v7a
--     NDK toolchain:               arm-linux-androideabi-clang
--     STL type:                    c++_static
--     Native API level:            16
--   Android SDK:                   /Users/injookim/Library/Android/sdk (tools: 26.1.1 build tools: 28.0.3)
--
--   GUI:
--
--   Media I/O:
--     ZLib:                        /Users/injookim/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/libz.a (ver 1.2.7)
--     JPEG:                        build-libjpeg-turbo (ver 1.5.3-62)
--     WEBP:                        build (ver encoder: 0x020e)
--     PNG:                         build (ver 1.6.35)
--     TIFF:                        build (ver 42 - 4.0.9)
--     JPEG 2000:                   build (ver 1.900.1)
--     OpenEXR:                     build (ver 1.7.1)
--     HDR:                         YES
--     SUNRASTER:                   YES
--     PXM:                         YES
--     PFM:                         YES
--
--   Video I/O:
--
--   Parallel framework:            pthreads
--
--   Trace:                         YES (built-in)
--
--   Other third-party libraries:
--     Custom HAL:                  YES (carotene (ver 0.0.1))
--     Protobuf:                    build (3.5.1)
--
--   Python (for build):            /usr/bin/python2.7
--
--   Java:                          export all functions
--     ant:                         NO
--     Java wrappers:               YES
--     Java tests:                  NO
--
--   Install to:                    /Users/injookim/Project/android_opencv/opencv
-- -----------------------------------------------------------------
--
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/injookim/Project/opencv-4.0.1/.build/Release_Android


4. 빌드(make or ninja)

 cmake가 완료되면, 아래와 같이 make -j4 명령을 수행해주면 빌드된다.

make -j4

make시에, 아래와 같은  error message가 나올 경우가 있는데, 이 경우에는 ANDROID_HOME 환경변수를 terminal 환경에 추가해줘야 된다. zsh는 .zshrc, bash이면 .bashrc

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':15-puzzle'.
> SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.
.zshrc
export ANDROID_HOME=/Users/injookim/Library/Android/sdk

cmake 옵션 중에, -GNinja 옵션을 추가해 주면,  아래와 같이 ninja를 사용할 수도 있다. 물론, 그전에 brew를 사용해 ninja를 설치해 주어야 한다.

ninja -j4

빌드 중에, Gradle 관련, error가 뜬다면, JDK  버전이 8인지 확인이 필요하다.
최종적으로 아래와 같은 메시지가 나오면 빌드가 완료된 것이다.

BUILD SUCCESSFUL in 18s
96 actionable tasks: 59 executed, 37 up-to-date
AAPT2 aapt2-3.2.1-4818971-osx Daemon #0: shutdown
AAPT2 aapt2-3.2.1-4818971-osx Daemon #1: shutdown
AAPT2 aapt2-3.2.1-4818971-osx Daemon #2: shutdown
VCS Checkout Cache (/Users/injookim/Project/opencv-4.0.1/.build/Release_Android/opencv_android/.gradle/vcsWorkingDirs) has not been cleaned up in 0 days
[100%] Built target android_sample_tutorial-2-mixedprocessing


5. Install

make install 해주면, 지정된 디렉토리에 lib.를 복사해 주고, libopencv_java4.so 파일이 생성되어 있는 것을 확인해 주면 된다.

make install


*
생성된 파일로 실제 안드로이드 머신에서 돌려 보지는 않아, 동작 확인이 된 건 아니다.
그리고, Java Wrapper가 꼭 필요한 지에 대한 의문도 있어서, Java Wrapper를 사용하지 않을 경우의 사용법도 구현해 볼 예정이다.
cmake 옵션 중에 아래 옵션을 OFF로 하게 되면, Java Wrapper가 돌아가지 않고, inlcude와  static lib. 만이 생성된다.

-DBUILD_ANDROID_PROJECTS=OFF


6. Reference



+ Recent posts