From efc87105a3685576a89a14dc716bcb3e56f8183b Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Wed, 15 Aug 2012 10:56:50 +0400 Subject: [PATCH] improving android tutorial v2, removing v1 --- .../android_binary_package.rst | 491 ------------------ .../android_binary_package_using_with_NDK.rst | 295 ----------- .../android_dev_intro.rst | 81 ++- .../dev_with_OCV_on_Android.rst | 4 +- .../images/ndk_build.png | Bin 14187 -> 19100 bytes .../table_of_content_introduction.rst | 37 -- 6 files changed, 80 insertions(+), 828 deletions(-) delete mode 100644 doc/tutorials/introduction/android_binary_package/android_binary_package.rst delete mode 100644 doc/tutorials/introduction/android_binary_package/android_binary_package_using_with_NDK.rst diff --git a/doc/tutorials/introduction/android_binary_package/android_binary_package.rst b/doc/tutorials/introduction/android_binary_package/android_binary_package.rst deleted file mode 100644 index d95a344979..0000000000 --- a/doc/tutorials/introduction/android_binary_package/android_binary_package.rst +++ /dev/null @@ -1,491 +0,0 @@ - -.. _Android_Binary_Package: - - -Using OpenCV4Android SDK with Eclipse -************************************* - -This tutorial was tested using Ubuntu 10.04 and Windows 7 SP1 operating systems. -However, it should also work with any other **OS**\ , supported by Android SDK. -If you encounter any error after thoroughly following these steps, feel free to contact us via `OpenCV4Android `_ discussion group or OpenCV `Q&A forum `_ . We'll do our best to help you out. - -Quick environment setup for Android development -=============================================== - -If you are making a clean environment install, then you can try `Tegra Android Development Pack `_ -(**TADP**) released by **NVIDIA**. - -When unpacked, TADP will cover all of the environment setup automatically and you can go straight to the section :ref:`Get_the_OpenCV_package_for_Android_development`. - -If you are a beginner in Android development then we also recommend you to start with TADP. - -.. note:: *NVIDIA*\ 's Tegra Android Development Pack includes some special features for |Nvidia_Tegra_Platform|_ but its use is not limited to *Tegra* devices only. - - * You need at least *1.6 Gb* free disk space for the install. - - * TADP will download Android SDK platforms and Android NDK from Google's server, so Internet connection is required for the installation. - - * TADP may ask you to flash your development kit at the end of installation process. Just skip this step if you have no |Tegra_Ventana_Development_Kit|_\ . - - * (``UNIX``) TADP will ask you for *root* in the middle of installation, so you need to be a member of *sudo* group. - - .. - - -.. |Nvidia_Tegra_Platform| replace:: *NVIDIA*\ ’s Tegra platform -.. _Nvidia_Tegra_Platform: http://developer.nvidia.com/node/19071 -.. |Tegra_Ventana_Development_Kit| replace:: Tegra Ventana Development Kit -.. _Tegra_Ventana_Development_Kit: http://developer.nvidia.com/tegra-ventana-development-kit - -.. _Android_Environment_Setup_Lite: - -Manual environment setup for Android Development -================================================ - -You need the following to be installed: - -#. **Sun JDK 6** - - Visit `Java SE Downloads page `_ and download an installer for your OS. - - Here is a detailed :abbr:`JDK (Java Development Kit)` `installation guide `_ - for Ubuntu and Mac OS (only JDK sections are applicable for OpenCV) - - .. note:: OpenJDK is not suitable for Android development, since Android SDK supports only Sun JDK. - If you use Ubuntu, after installation of Sun JDK you should run the following command to set Sun java environment: - - .. code-block:: bash - - sudo update-java-alternatives --set java-6-sun - -#. **Android SDK** - - Get the latest ``Android SDK`` from http://developer.android.com/sdk/index.html - - Here is Google's `install guide `_ for the SDK. - - .. note:: If you choose SDK packed into a Windows installer, then you should have 32-bit JRE installed. It is not a prerequisite for Android development, but installer is a x86 application and requires 32-bit Java runtime. - - .. note:: If you are running x64 version of Ubuntu Linux, then you need ia32 shared libraries for use on amd64 and ia64 systems to be installed. You can install them with the following command: - - .. code-block:: bash - - sudo apt-get install ia32-libs - - For Red Hat based systems the following command might be helpful: - - .. code-block:: bash - - sudo yum install libXtst.i386 - -#. **Android SDK components** - - You need the following SDK components to be installed: - - * *Android SDK Tools, revision14* or newer. - - Older revisions should also work, but they are not recommended. - - * *SDK Platform Android 3.0, API 11* and *Android 2.3.1, API 9*. - - The minimal platform supported by OpenCV Java API is **Android 2.2** (API 8). This is also the minimum API Level required for the provided samples to run. - See the ```` tag in their **AndroidManifest.xml** files. - But for successful compilation of some samples the **target** platform should be set to Android 3.0 (API 11) or higher. It will not prevent them from running on Android 2.2. - - .. image:: images/android_sdk_and_avd_manager.png - :alt: Android SDK Manager - :align: center - - See `Adding SDK Components `_ for help with installing/updating SDK components. - -#. **Eclipse IDE** - - Check the `Android SDK System Requirements `_ document for a list of Eclipse versions that are compatible with the Android SDK. - For OpenCV 2.4.x we recommend Eclipse 3.7 (Indigo) or later versions. They work well for OpenCV under both Windows and Linux. - - If you have no Eclipse installed, you can get it from the `official site `_. - -#. **ADT plugin for Eclipse** - - These instructions are copied from `Android Developers site `_, check it out in case of any ADT-related problem. - - Assuming that you have Eclipse IDE installed, as described above, follow these steps to download and install the ADT plugin: - - #. Start Eclipse, then select :menuselection:`Help --> Install New Software...` - #. Click :guilabel:`Add` (in the top-right corner). - #. In the :guilabel:`Add Repository` dialog that appears, enter "ADT Plugin" for the Name and the following URL for the Location: - - https://dl-ssl.google.com/android/eclipse/ - - #. Click :guilabel:`OK` - - .. note:: If you have trouble acquiring the plugin, try using "http" in the Location URL, instead of "https" (https is preferred for security reasons). - - #. In the :guilabel:`Available Software` dialog, select the checkbox next to :guilabel:`Developer Tools` and click :guilabel:`Next`. - #. In the next window, you'll see a list of the tools to be downloaded. Click :guilabel:`Next`. - #. Read and accept the license agreements, then click :guilabel:`Finish`. - - .. note:: If you get a security warning saying that the authenticity or validity of the software can't be established, click :guilabel:`OK`. - - #. When the installation completes, restart Eclipse. - -.. _Get_the_OpenCV_package_for_Android_development: - -Get the OpenCV4Android SDK -========================== - -#. Go to the `OpenCV dowload page on SourceForge `_ and download the latest available version. Currently it's |opencv_android_bin_pack_url|_ - -#. Create a new folder for development for Android with OpenCV. For this tutorial I have unpacked OpenCV to the :file:`C:\\Work\\OpenCV4Android\\` directory. - - .. note:: Better to use a path without spaces in it. Otherwise you will probably have problems with :command:`ndk-build`. - -#. Unpack the OpenCV package into the chosen directory. - - You can unpack it using any popular archiver (e.g with |seven_zip|_): - - .. image:: images/android_package_7zip.png - :alt: Exploring OpenCV package with 7-Zip - :align: center - - On Unix you can use the following command: - - .. code-block:: bash - - unzip ~/Downloads/OpenCV-2.4.2-android-sdk.zip - -.. |opencv_android_bin_pack| replace:: OpenCV-2.4.2-android-sdk.zip -.. _opencv_android_bin_pack_url: http://sourceforge.net/projects/opencvlibrary/files/opencv-android/2.4.2/OpenCV-2.4.2-android-sdk.zip/download -.. |opencv_android_bin_pack_url| replace:: |opencv_android_bin_pack| -.. |seven_zip| replace:: 7-Zip -.. _seven_zip: http://www.7-zip.org/ - -Open OpenCV library and samples in Eclipse -========================================== - -#. Start *Eclipse* and choose your workspace location. - - I recommend to start familiarizing yourself with OpenCV for Android from a new clean workspace. So I have chosen my OpenCV package directory for the new workspace: - - .. image:: images/eclipse_1_choose_workspace.png - :alt: Choosing C:\Work\android-opencv\ as workspace location - :align: center - -#. Configure your ADT plugin. - - .. important:: In most cases the ADT plugin finds Android SDK automatically, but sometimes it fails and shows the following prompt: - - .. image:: images/eclipse_1a_locate_sdk.png - :alt: Locating Android SDK - :align: center - - Select :guilabel:`Use existing SDKs` option, browse for Android SDK folder and click :guilabel:`Finish`. - - To make sure the SDK folder is set correctly do the following step taken from `Configuring the ADT Plugin `_ tutorial by *Google*: - - * Select :menuselection:`Window --> Preferences...` to open the Preferences panel (Mac OS X: :menuselection:`Eclipse --> Preferences`): - - .. image:: images/eclipse_2_window_preferences.png - :alt: Select Window > Preferences... - :align: center - - * Select :guilabel:`Android` in the left panel. - - You may see a dialog asking whether you want to send usage statistics to *Google*. If so, make your choice and click :guilabel:`Proceed`. - - If the Android SDK folder isn't configured you'll see the following: - - .. image:: images/eclipse_3_preferences_android.png - :alt: Select Android from the left panel - :align: center - - * To locate the SDK manually, click :guilabel:`Browse...`. - - * Click :guilabel:`Apply` button at the bottom right corner of main panel. - - If the SDK folder is already configured correctly you'll see something like this: - - .. image:: images/eclipse_4_locate_sdk.png - :alt: Locate Android SDK - :align: center - - * Click :guilabel:`OK` to close preferences dialog. - -#. Import OpenCV and samples into workspace. - - OpenCV library is packed as a ready-for-use `Android Library Project - `_. You can simply reference it in your projects. - - Each sample included into the |opencv_android_bin_pack| is a regular Android project that already references OpenCV library. - Follow the steps below to import OpenCV and samples into the workspace: - - * Right click on the :guilabel:`Package Explorer` window and choose :guilabel:`Import...` option from the context menu: - - .. image:: images/eclipse_5_import_command.png - :alt: Select Import... from context menu - :align: center - - * In the main panel select :menuselection:`General --> Existing Projects into Workspace` and press :guilabel:`Next` button: - - .. image:: images/eclipse_6_import_existing_projects.png - :alt: General > Existing Projects into Workspace - :align: center - - * In the :guilabel:`Select root directory` field locate your OpenCV package folder. Eclipse should automatically locate OpenCV library and samples: - - .. image:: images/eclipse_7_select_projects.png - :alt: Locate OpenCV library and samples - :align: center - - * Click :guilabel:`Finish` button to complete the import operation. - - After clicking :guilabel:`Finish` button Eclipse will load all selected projects into workspace. Numerous errors will be indicated: - - .. image:: images/eclipse_8_false_alarm.png - :alt: Confusing Eclipse screen with numerous errors - :align: center - - However, **all these errors are only false-alarms**! - - To get rid of these misleading error notifications select OpenCV library in :guilabel:`Package Explorer` and press :kbd:`F5`. Then select a sample (except first samples in *Tutorial Base* and *Tutorial Advanced*) and press :kbd:`F5` again. - - In some cases these errors disappear after :menuselection:`Project --> Clean... --> Clean all --> OK`. - - Sometimes more advanced manipulations are required: - - * The provided projects are configured for `API 11` target that can be missing platform in your Android SDK. After right click on any project select :guilabel:`Properties` and then :guilabel:`Android` on the left pane. Click some target with `API Level` 11 or higher: - - .. image:: images/eclipse_8a_target.png - :alt: Updating target - :align: center - - Eclipse will rebuild your workspace and error icons will disappear one by one: - - .. image:: images/eclipse_9_errors_dissapearing.png - :alt: After small help Eclipse removes error icons! - :align: center - - Once Eclipse completes build you will have the clean workspace without any build errors: - - .. image:: images/eclipse_10_crystal_clean.png - :alt: OpenCV package imported into Eclipse - :align: center - -Running OpenCV Samples -====================== - -At this point you should be able to build and run all samples except ``face-detection``, ``Tutorial 3`` and ``Tutorial 4``. These samples include native code and require Android NDK to build working applications, see the next tutorial :ref:`Android_Binary_Package_with_NDK` to learn how to compile them. - -Also, please consider that ``Tutorial 0 - Android Camera`` and ``Tutorial 1 - Add OpenCV`` samples are able to run on emulator from the Android SDK. Other samples use OpenCV Native Camera which may not work with emulator. - -.. note:: Latest *Android SDK tools, revision 19* can run ARM v7a OS images but *Google* provides such image for Android 4.x only. - -Well, running samples from Eclipse is very simple: - -* Connect your device with :command:`adb` tool from Android SDK or create emulator with camera support. - - * See `Managing Virtual Devices - `_ document for help with Android Emulator. - * See `Using Hardware Devices - `_ for help with real devices (not emulators). - - -* Select project you want to start in :guilabel:`Package Explorer` and just press :kbd:`Ctrl + F11` or select option :menuselection:`Run --> Run` from the main menu, or click :guilabel:`Run` button on the toolbar. - - .. note:: Android Emulator can take several minutes to start. So, please, be patient. - -* On the first run Eclipse will ask you about the running mode for your application: - - .. image:: images/eclipse_11_run_as.png - :alt: Run sample as Android Application - :align: center - -* Select the :guilabel:`Android Application` option and click :guilabel:`OK` button. Eclipse will install and run the sample. - - Chances are that on the first launch you will not have the `OpenCV Manager `_ package installed. In this case you will see the following message: - - .. image:: images/android_emulator_opencv_manager_fail.png - :alt: You will see this message if you have no OpenCV Manager installed - :align: center - - To get rid of the message you will need to install `OpenCV Manager` and the appropriate `OpenCV binary package`. Simply tap :menuselection:`Yes` if you have *Google Play Market* installed on your device/emulator. It will redirect you to the corresponding page on *Google Play Market*. - - If you have no access to the *Market*, which is often the case with emulators — you will need to install the packages from OpenCV4Android SDK folder manually. Open the console/terminal and type in the following two commands: - - .. code-block:: sh - :linenos: - - /platform-tools/adb install /apk/OpenCV_2.4.2_Manager.apk - /platform-tools/adb install /apk/OpenCV_2.4.2_binary_pack_armv7a.apk - - If you're running Windows, that will probably look like this: - - .. image:: images/install_opencv_manager_with_adb.png - :alt: Run these commands in the console to install OpenCV Manager - :align: center - - When done, you will be able to run OpenCV samples on your device/emulator seamlessly. - -* Here is ``Tutorial 2 - Use OpenCV Camera`` sample, running on top of stock camera-preview of the emulator. - - .. image:: images/emulator_canny.png - :alt: Tutorial 1 Basic - 1. Add OpenCV - running Canny - :align: center - -How to use OpenCV library project in your application -===================================================== - -In this section we will explain how to make some existing project to use OpenCV. -Starting with 2.4.2 release for Android, *OpenCV Manager* is used to provide apps with the best available version of OpenCV. -You can get more information here: `Intro slides `_ and :ref:`Android_OpenCV_Manager`. - -Application development with async initialization -------------------------------------------------- - -Using async initialization is a **recommended** way for application development. It uses the OpenCV Manager to access OpenCV libraries. - -#. Add OpenCV library project to your workspace. Use menu :guilabel:`File –> Import –> Existing project in your workspace`, - press :guilabel:`Browse` button and locate OpenCV4Android SDK (:file:`OpenCV-2.4.2-android-sdk/sdk`). - - .. image:: images/eclipse_opencv_dependency0.png - :alt: Add dependency from OpenCV library - :align: center - -#. In application project add a reference to the OpenCV Java SDK in :guilabel:`Project –> Properties –> Android –> Library –> Add` select ``OpenCV Library - 2.4.2``. - - .. image:: images/eclipse_opencv_dependency1.png - :alt: Add dependency from OpenCV library - :align: center - -To use OpenCV Manager-based approach you need to install packages with the `Manager` and `OpenCV binary pack` for you platform. -You can do it using Google Play Market or manually with ``adb`` tool: - - .. code-block:: sh - :linenos: - - /platform-tools/adb install /apk/OpenCV_2.4.2_Manager.apk - /platform-tools/adb install /apk/OpenCV_2.4.2_binary_pack_armv7a.apk - -There is a very base code snippet implementing the async initialization. It shows basic principles. See the "15-puzzle" OpenCV sample for details. - -.. code-block:: java - :linenos: - - public class MyActivity extends Activity implements HelperCallbackInterface - { - private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) { - @Override - public void onManagerConnected(int status) { - switch (status) { - case LoaderCallbackInterface.SUCCESS: - { - Log.i(TAG, "OpenCV loaded successfully"); - // Create and set View - mView = new puzzle15View(mAppContext); - setContentView(mView); - } break; - default: - { - super.onManagerConnected(status); - } break; - } - } - }; - - /** Called when the activity is first created. */ - @Override - public void onCreate(Bundle savedInstanceState) - { - Log.i(TAG, "onCreate"); - super.onCreate(savedInstanceState); - - Log.i(TAG, "Trying to load OpenCV library"); - if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2, this, mOpenCVCallBack)) - { - Log.e(TAG, "Cannot connect to OpenCV Manager"); - } - } - - // ... - } - -It this case application works with OpenCV Manager in asynchronous fashion. ``OnManagerConnected`` callback will be called in UI thread, when initialization finishes. -Please note, that it is not allowed to use OpenCV calls or load OpenCV-dependent native libs before invoking this callback. -Load your own native libraries that depend on OpenCV after the successful OpenCV initialization. - -Application development with static initialization --------------------------------------------------- - -According to this approach all OpenCV binaries are included into your application package. It is designed mostly for development purposes. -This approach is deprecated for the production code, release package is recommended to communicate with OpenCV Manager via the async initialization described above. - -#. Add the OpenCV library project to your workspace the same way as for the async initialization above. - Use menu :guilabel:`File –> Import –> Existing project in your workspace`, push :guilabel:`Browse` button and select OpenCV SDK path (:file:`OpenCV-2.4.2-android-sdk/sdk`). - - .. image:: images/eclipse_opencv_dependency0.png - :alt: Add dependency from OpenCV library - :align: center - -#. In the application project add a reference to the OpenCV4Android SDK in :guilabel:`Project –> Properties –> Android –> Library –> Add` select ``OpenCV Library - 2.4.2``; - - .. image:: images/eclipse_opencv_dependency1.png - :alt: Add dependency from OpenCV library - :align: center - -#. If your application project **doesn't have a JNI part**, just copy the OpenCV native libs to your project directory to folder :file:`libs/target_arch/`. - - In case of the application project **with a JNI part**, instead of manual libraries copying you need to modify your ``Android.mk`` file: - add the following two code lines after the ``"include $(CLEAR_VARS)"`` and before ``"include path_to_OpenCV-2.4.2-android-sdk/sdk/native/jni/OpenCV.mk"`` - - .. code-block:: make - :linenos: - - OPENCV_CAMERA_MODULES:=on - OPENCV_INSTALL_MODULES:=on - - The result should look like the following: - - .. code-block:: make - :linenos: - - include $(CLEAR_VARS) - - # OpenCV - OPENCV_CAMERA_MODULES:=on - OPENCV_INSTALL_MODULES:=on - include ../../sdk/native/jni/OpenCV.mk - - After that the OpenCV libraries will be copied to your application :file:`libs` folder during the JNI part build. - - Eclipse will automatically include all the libraries from the :file:`libs` folder to the application package (APK). - -#. The last step of enabling OpenCV in your application is Java initialization code before call to OpenCV API. - It can be done, for example, in the static section of the ``Activity`` class: - - .. code-block:: java - :linenos: - - static { - if (!OpenCVLoader.initDebug()) { - // Handle initialization error - } - } - - If you application includes other OpenCV-dependent native libraries you should load them **after** OpenCV initialization: - - .. code-block:: java - :linenos: - - static { - if (!OpenCVLoader.initDebug()) { - // Handle initialization error - } else { - System.loadLibrary("my_jni_lib1"); - System.loadLibrary("my_jni_lib2"); - } - } - -What's next? -============ - -Read the :ref:`Android_Binary_Package_with_NDK` tutorial to learn how to add native OpenCV code to your Android project. diff --git a/doc/tutorials/introduction/android_binary_package/android_binary_package_using_with_NDK.rst b/doc/tutorials/introduction/android_binary_package/android_binary_package_using_with_NDK.rst deleted file mode 100644 index 75dbf80950..0000000000 --- a/doc/tutorials/introduction/android_binary_package/android_binary_package_using_with_NDK.rst +++ /dev/null @@ -1,295 +0,0 @@ - - -.. _Android_Binary_Package_with_NDK: - - -Using OpenCV in C++ code with OpenCV4Android SDK -************************************************ - -The Android way is writing all your code in Java. But sometimes, it is not enough and you need to go to the native level and write some parts of your application in C/C++. -This is especially important when you already have some computer vision code which is written in C++ and uses OpenCV, and you want to reuse it in your Android application. -In this case the only way is to use `JNI `_ - a Java framework for interaction with native code. -It means, that you should add a Java class with native methods exposing your C++ functionality to the Java part of your Android application. - -This tutorial describes a fast way to create and build Android applications containing OpenCV code written in C++. It shows how to build an application which uses OpenCV inside its JNI calls. Tutorial 3 and 4 from the OpenCV for Android SDK can be used as examples. OpenCV Sample "face-detect" also contain a call to C++ class. - -Please note that before starting this tutorial you should go through all the steps, described in the tutorial :ref:`Android_Binary_Package`. - -This tutorial was tested using Ubuntu 10.04 and Windows 7 SP1 operating systems. -However, it should also work on Mac OS X. -If you encounter any error after thoroughly following these steps, feel free to contact us via `OpenCV4Android `_ discussion group or OpenCV `Q&A forum `_ . We'll do our best to help you out. - -Prerequisites: Setup Android NDK -================================ - -To compile C++ code for Android platform you need ``Android Native Development Kit`` (*NDK*). - -You can get the latest version of NDK from the `download page `_. To install Android NDK just extract the archive to some folder on your computer. Here are `installation instructions `_. - -.. note:: Before start you can read official Android NDK documentation which is in the Android NDK archive, in the folder :file:`docs/`. - - The main article about using Android NDK build system is in the :file:`ANDROID-MK.html` file. - - Some additional information you can find in the :file:`APPLICATION-MK.html`, :file:`NDK-BUILD.html` files, and :file:`CPU-ARM-NEON.html`, :file:`CPLUSPLUS-SUPPORT.html`, :file:`PREBUILTS.html`. - -Theory: Android application structure -===================================== - -Usually code of an Android application has the following structure: - -+ :file:`root folder of the project/` - - - :file:`jni/` - - - :file:`libs/` - - - :file:`res/` - - - :file:`src/` - - - :file:`AndroidManifest.xml` - - - :file:`project.properties` - - - :file:`... other files ...` - -where: - -+ the :file:`src` folder contains Java code of the application, - -+ the :file:`res` folder contains resources of the application (images, xml files describing UI layout , etc), - -+ the :file:`libs` folder will contain native libraries after a successful build, - -+ and the :file:`jni` folder contains C/C++ application source code and NDK's build scripts :file:`Android.mk` and :file:`Application.mk`. - - Written in Makefile language, these scripts control the C++ build process. - - -Also the root folder should contain the following files: - -* :file:`AndroidManifest.xml` file presents essential information about application to the Android system - (name of the Application, name of main application's package, components of the application, required permissions, etc). - - It can be created using Eclipse wizard or :command:`android` tool from Android SDK. - -* :file:`project.properties` is a text file containing information about target Android platform and other build details. - - This file is generated by Eclipse or can be created with *Android* tool included in Android SDK. - -.. note:: Both files (:file:`AndroidManifest.xml` and :file:`project.properties`) are required to compile the C++ part of the application, since NDK build system relies on them. If any of these files does not exist, compile the Java part of the project before the C++ part. - -.. _NDK_build_cli: - - -Theory: Building application with C++ native part from command line -=================================================================== - -Here is the standard way to compile C++ part of an Android application: - -#. Open console and go to the root folder of an Android application - - .. code-block:: bash - - cd / - - .. note:: Alternatively you can go to the :file:`jni` folder of the Android project. But samples from OpenCV4Android SDK are configured for building from the project root level (because of relative path to the OpenCV library). - -#. Run the following command - - .. code-block:: bash - - /ndk-build - - .. note:: On Windows we recommend to use ``ndk-build.cmd`` in standard Windows console (``cmd.exe``) rather than the similar ``bash`` script in ``Cygwin`` shell. - - .. image:: images/ndk_build.png - :alt: NDK build - :align: center - -#. After executing this command the C++ part of the source code is compiled. - -After that the Java part of the application can be (re)compiled (using either *Eclipse* or *Ant* build tool). - -.. note:: Some parameters can be set for the :command:`ndk-build`: - - **Example 1**: Verbose compilation - - .. code-block:: bash - - /ndk-build V=1 - - **Example 2**: Rebuild all - - .. code-block:: bash - - /ndk-build -B - - -.. _Android_NDK_integration_with_Eclipse: - - -Theory: Building application with C++ native part from *Eclipse* -================================================================ - -There are several possible ways to integrate compilation of C++ code by Android NDK into Eclipse compilation process. -We recommend the approach based on Eclipse :abbr:`CDT(C/C++ Development Tooling)` Builder. - -.. important:: Make sure your Eclipse IDE has the :abbr:`CDT(C/C++ Development Tooling)` plugin installed. Menu :guilabel:`Help -> About Eclipse SDK` and push :guilabel:`Installation Details` button. - -.. image:: images/eclipse_inst_details.png - :alt: Configure builders - :align: center - -To install the `CDT plugin `_ use menu :guilabel:`Help -> Install New Software...`, -then paste the CDT 8.0 repository URL http://download.eclipse.org/tools/cdt/releases/indigo as shown in the picture below and click :guilabel:`Add...`, name it *CDT* and click :guilabel:`OK`. - -.. image:: images/eclipse_inst_cdt.png - :alt: Configure builders - :align: center - -``CDT Main Features`` should be enough: - -.. image:: images/eclipse_inst_cdt_2.png - :alt: Configure builders - :align: center - - -.. important:: OpenCV for Android 2.4.2 package contains sample projects pre-configured to use CDT Builder. It automatically builds JNI part via ``ndk-build``. - -#. Define the ``NDKROOT`` environment variable containing the path to Android NDK in your system (e.g. **"X:\\Apps\\android-ndk-r8"** or **"/opt/android-ndk-r8"**). - -#. | CDT Builder is already configured for **Windows** hosts, - | on **Linux** or **MacOS** a small modification is required: - - Open `Project Properties` of the projects having JNI part (`face-detection`, `Tutorial 3` and `Tutorial 4`), - select :guilabel:`C/C++ Build` in the left pane, - remove **".cmd"** and leave ``"${NDKROOT}/ndk-build"`` in the :guilabel:`Build command` edit box and click :guilabel:`OK`. - - .. image:: images/eclipse_cdt_cfg4.png - :alt: Configure CDT - :align: center - -#. Use menu :guilabel:`Project` -> :guilabel:`Clean...` to make sure that NDK build is invoked on the project build: - - .. image:: images/eclipse_ndk_build.png - :alt: Select resources folder to refresh automatically - :align: center - -Theory: The structure of :file:`Android.mk` and :file:`Application.mk` scripts -============================================================================== - -The script :file:`Android.mk` usually has the following structure: - -.. code-block:: make - - LOCAL_PATH := $(call my-dir) - - include $(CLEAR_VARS) - LOCAL_MODULE := - LOCAL_SRC_FILES := - := - ... - := - - include $(BUILD_SHARED_LIBRARY) - -This is the minimal file :file:`Android.mk`, which builds C++ source code of an Android application. Note that the first two lines and the last line are mandatory for any :file:`Android.mk`. - -Usually the file :file:`Application.mk` is optional, but in case of project using OpenCV, when STL and exceptions are used in C++, it also should be created. Example of the file :file:`Application.mk`: - -.. code-block:: make - - APP_STL := gnustl_static - APP_CPPFLAGS := -frtti -fexceptions - APP_ABI := armeabi-v7a - -Sometimes ``ndk-build`` fails with an `"undefined reference to std::basic_string<...>"` error message. Then one more additional code line in the :file:`Android.mk` can help: - -.. code-block:: make - - APP_PLATFORM := android-9 - -Practice: Build samples from OpenCV4Android SDK -=============================================== - -OpenCV4Android SDK includes 3 samples having JNI resources: - -* *Tutorial 3 (Advanced) - Add Native OpenCV* - - This sample illustrates how you can use OpenCV in C++ without OpenCV Java API. - -* *Tutorial 4 (Advanced) - Mix Java+Native OpenCV* - - This sample shows how you can mix OpenCV Java API and native C++ code. - -* *Sample - face-detection* - - This sample illustrates usage of both simple OpenCV face detector via Java API and advanced detection based face tracker via JNI and C++. - -.. important:: Before OpenCV **2.4.2** for Android these projects were not configured to use CDT for building their native part , so you can do it yourself. - -Practice: Create an Android application, which uses OpenCV -========================================================== - -To build your own Android application, which uses OpenCV from native part, the following steps should be done: - -#. The archive with OpenCV4Android SDK should be downloaded and extracted to some folder (e.g. :file:`C:\\Work\\OpenCV4Android\\OpenCV-2.4.0`). - -#. You can use an environment variable to specify the location of OpenCV package or just hardcode full or relative path in the :file:`jni/Android.mk` of your projects. - -#. The file :file:`jni/Android.mk` should be written for the current application using the common rules for the file. - - For detailed information see the Android NDK documentation from the Android NDK archive, in the file - :file:`/docs/ANDROID-MK.html` - -#. The line - - .. code-block:: make - - include C:\Work\android-opencv\OpenCV-2.4.0\share\OpenCV\OpenCV.mk - - should be inserted into the :file:`jni/Android.mk` file **after** the line - - .. code-block:: make - - include $(CLEAR_VARS) - -#. Several variables can be used to customize OpenCV stuff, but you **don't need** to use them when your application uses the `async initialization` via the `OpenCV Manager` API. - - Note: these variables should be set **before** the ``"include .../OpenCV.mk"`` line: - - .. code-block:: make - - OPENCV_INSTALL_MODULES:=on - - Copies necessary OpenCV dynamic libs to the project ``libs`` folder in order to include them into the APK. - - .. code-block:: make - - OPENCV_CAMERA_MODULES:=off - - Skip native OpenCV camera related libs copying to the project ``libs`` folder. - - .. code-block:: make - - OPENCV_LIB_TYPE:=STATIC - - Perform static link with OpenCV. By default dynamic link is used and the project JNI lib depends on ``libopencv_java.so``. - -#. The file :file:`Application.mk` should exist and should contain lines - - .. code-block:: make - - APP_STL := gnustl_static - APP_CPPFLAGS := -frtti -fexceptions - - Also the line - - .. code-block:: make - - APP_ABI := armeabi-v7a - - is recommended for the applications targeting modern ARMs - -#. Either use :ref:`manual ` ``ndk-build`` invocation or :ref:`setup Eclipse CDT Builder ` to build native JNI lib before Java part [re]build and APK creation. diff --git a/doc/tutorials/introduction/android_binary_package/android_dev_intro.rst b/doc/tutorials/introduction/android_binary_package/android_dev_intro.rst index 0b4282fde1..5e973b6e87 100644 --- a/doc/tutorials/introduction/android_binary_package/android_dev_intro.rst +++ b/doc/tutorials/introduction/android_binary_package/android_dev_intro.rst @@ -13,7 +13,7 @@ If you encounter any error after thoroughly following these steps, feel free to Preface ======= -Android is a Linux-based, open source mobile operating system developed by Open Handset Alliance led by Google. See the `official site `_ for general details. +Android is a Linux-based, open source mobile operating system developed by Open Handset Alliance led by Google. See the `Android home site `_ for general details. Development for Android significantly differs from development for other platforms. So before starting programming for Android we recommend you make sure that you are familiar with the following key topis: @@ -263,6 +263,80 @@ Usually the file :file:`Application.mk` is optional, but in case of project usin APP_CPPFLAGS := -frtti -fexceptions APP_ABI := armeabi-v7a + +.. _NDK_build_cli: + +Building application native part from command line +================================================== + +Here is the standard way to compile C++ part of an Android application: + +#. Open console and go to the root folder of an Android application + + .. code-block:: bash + + cd / + +#. Run the following command + + .. code-block:: bash + + /ndk-build + + .. note:: On Windows we recommend to use ``ndk-build.cmd`` in standard Windows console (``cmd.exe``) rather than the similar ``bash`` script in ``Cygwin`` shell. + + .. image:: images/ndk_build.png + :alt: NDK build + :align: center + +#. After executing this command the C++ part of the source code is compiled. + +After that the Java part of the application can be (re)compiled (using either *Eclipse* or *Ant* build tool). + +.. note:: Some parameters can be set for the :command:`ndk-build`: + + **Example 1**: Verbose compilation + + .. code-block:: bash + + /ndk-build V=1 + + **Example 2**: Rebuild all + + .. code-block:: bash + + /ndk-build -B + +.. _CDT_Builder: + +Building application native part from *Eclipse* (CDT Builder) +============================================================= + +There are several possible ways to integrate compilation of native C++ code by Android NDK into Eclipse build process. +We recommend the approach based on Eclipse :abbr:`CDT(C/C++ Development Tooling)` Builder. + +.. important:: Make sure your Eclipse IDE has the :abbr:`CDT(C/C++ Development Tooling)` plugin installed. Menu :guilabel:`Help -> About Eclipse SDK -> Installation Details`. + +.. image:: images/eclipse_inst_details.png + :alt: Eclipse About + :align: center + +.. important:: OpenCV for Android 2.4.2 package contains sample projects pre-configured CDT Builders. For your own projects follow the steps below. + +#. Define the ``NDKROOT`` environment variable containing the path to Android NDK in your system (e.g. ``"X:\\Apps\\android-ndk-r8"`` or ``"/opt/android-ndk-r8"``). + **On Windows** an environment variable can be set via :guilabel:`My Computer -> Properties -> Advanced -> Environment variables` and restarting Eclipse. + + **On Linux** and **MacOS** an environment variable can be set via appending a ``"export VAR_NAME=VAR_VALUE"`` line to the :file:`"~/.bashrc"` file and logging off and then on. + +#. Text 1. + + Text 2. + + .. image:: images/eclipse_cdt_cfg4.png + :alt: Configure CDT + :align: center + + Debugging and Testing ===================== In this section we will give you some easy-to-follow instructions on how to set up an emulator or hardware device for testing and debugging an Android project. @@ -286,7 +360,7 @@ Hardware Device --------------- If you have an Android device, you can use it to test and debug your applications. This way is more authentic, though a little bit harder to set up. You need to make some actions for Windows and Linux operating systems to be able to work with Android devices. No extra actions are required for Mac OS. See detailed information on configuring hardware devices in subsections below. -You may also consult the official `Android Developers site `_ for more information. +You may also consult the official `Android Developers site instructions `_ for more information. Windows host computer ^^^^^^^^^^^^^^^^^^^^^ @@ -387,6 +461,9 @@ Then restart your adb server (even better to restart the system), plug in your A :alt: List of attached devices :align: center +MacOS host computer +^^^^^^^^^^^^^^^^^^^ +No actions are required, just connect your device via USB and run ``adb devices`` to check connection. What's next =========== diff --git a/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.rst b/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.rst index d1eb26e072..ca0211a881 100644 --- a/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.rst +++ b/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.rst @@ -252,10 +252,8 @@ To build your own Android application, which uses OpenCV from native part, the f APP_PLATFORM := android-9 -#. Either use :ref:`manual ` ``ndk-build`` invocation or :ref:`setup Eclipse CDT Builder ` to build native JNI lib before Java part [re]build and APK creation. +#. Either use :ref:`manual ` ``ndk-build`` invocation or :ref:`setup Eclipse CDT Builder ` to build native JNI lib before Java part [re]build and APK creation. - **TBD:** move this info from tutorial v1 to part 1 of tutorial v2. - Hello OpenCV Sample =================== diff --git a/doc/tutorials/introduction/android_binary_package/images/ndk_build.png b/doc/tutorials/introduction/android_binary_package/images/ndk_build.png index 80d01ff15fd95e1ff110bb6b8e76a486de1b4a5a..633d0684e97d7455fe0db2e8affae4fb981d1f9f 100644 GIT binary patch literal 19100 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 literal 14187 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 OpenCV 2.3.1 - - *Author:* |Author_AndreyK| - - You will learn how to setup OpenCV for Android platform! - - ================ ================================================= - - .. tabularcolumns:: m{100pt} m{300pt} - .. cssclass:: toctableopencv - - ================ ================================================= - |AndroidBinPack| **Title:** :ref:`Android_Binary_Package_with_NDK` - - *Compatibility:* > OpenCV 2.3.1 - - *Author:* |Author_LeonidBLB| - - You will learn how to work with C++ OpenCV code for Android platform - - ================ ================================================= - - .. |AndroidBinPack| image:: images/android_logo.png - :height: 90pt - :width: 90pt - - -* **Android** tutorials v2 [in progress] - - .. tabularcolumns:: m{100pt} m{300pt} - .. cssclass:: toctableopencv - ================ ================================================= |AndroidLogo| **Title:** :ref:`Android_Dev_Intro` @@ -273,8 +238,6 @@ Here you can read tutorials about how to set up your computer to work with the O ../linux_eclipse/linux_eclipse ../windows_install/windows_install ../windows_visual_studio_Opencv/windows_visual_studio_Opencv - ../android_binary_package/android_binary_package - ../android_binary_package/android_binary_package_using_with_NDK ../android_binary_package/android_dev_intro ../android_binary_package/O4A_SDK ../android_binary_package/dev_with_OCV_on_Android