####################################
##FILL ME IN
####################################
## for a custom note with links:
## note =
## for the canned note of "This tutorial assumes that you have completed the
## previous tutorials:" just add the links
## note.0.link=
## descriptive title for the tutorial
## title = Building native ROS packages
## multi-line description to be displayed in search
## description = This tutorial show how to build native ROS nodes using the Android NDK
## the next tutorial description (optional)
## next =
## links to next tutorial (optional)
## next.0.link=[[android_ndk/Tutorials/SimpleNativeActivityApplication|Testing the sample application using a Native Activity]]
## next.1.link=[[android_ndk/Tutorials/Building The Example Applications using the Binary Distribution]]
## what level user is this tutorial for
## level= BeginnerCategory
## keywords = android native NDK
####################################
<<IncludeCSTemplate(TutorialCSHeaderTemplate)>>

<<TableOfContents(4)>>

= Building native ROS packages =
== Prerequisites ==
=== Installing dependencies ===
 {{{
$ sudo apt-get update
$ sudo apt-get install curl git
}}}

=== Installing latest version of Docker ===
'''Ubuntu:''' 

(Taken from https://docs.docker.com/installation/ubuntulinux/#ubuntu-trusty-1404-lts-64-bit)

Install using the available script from docker.

 {{{
$ curl -sSL https://get.docker.com/ubuntu/ | sudo sh
}}}

To verify that everything has worked as expected:

 {{{
$ sudo docker run -i -t ubuntu /bin/bash
}}}

Which should download the Ubuntu image, and then start bash in a container.

Then you should get something like this:

 {{{
root@20dd792aa8e9:/#
}}}

This means that everything is OK, close the docker container:

 {{{
root@20dd792aa8e9:/# exit
}}}

And we're ready to go!

== Cloning the roscpp_android repository ==
This repository contains the scripts to build the container and do the cross-compilation of the ROS libraries. Create a folder and clone the repository inside it.

 {{{
$ mkdir ~/ros-android-ndk
$ cd ~/ros-android-ndk
$ git clone https://github.com/ekumenlabs/roscpp_android.git
$ cd roscpp_android
}}}

== Building the container and cross-compiling ==

The script can generate two different types of output. The '''raw''' mode and the '''portable''' one:

 1. '''raw''' mode is intended to be used during porting new libraries to Android. It uses symbolic links to generate the Android NDK module, which saves space.
 2. '''portable''' copies all the required files to the Android NDK module and creates a .tar.gz with it. This file is intended to be used when distributing pre compiled ROS Android libraries.

By default, when running:

 {{{
$ ./do_docker.sh
}}}

will generate an ''output'' directory in the current directory, and build it in '''raw''' mode. To change the output path:

 {{{
$ ./do_docker.sh --raw /output/path
}}}

To generate a '''portable''' binary in ''output/roscpp_android_ndk.tar.gz'',

 {{{
$ ./do_docker.sh --portable
}}}

 {{{#!wiki blue/solid
You can also use '--delete-image' to remove the docker image and start building it again, or '--delete-tmp' to delete the content of /var/lib/docker/tmp in order to save space on your machine
}}}

Now you can go grab something to drink, this takes some time.

=== What does do_docker.sh do? ===
The script first creates a docker container based on Ubuntu 14.04 and install all the Ubuntu dependencies, then it fetches all the library dependencies and the ROS packages specified in the ndk.rosinstall file. Lastly, it cross-compiles the libraries and runs ´catkin_make´ to build the ROS packages.

== Verifying the cross-compilation ==
If everything went well you should see the following banner

 {{{
summary of what just happened:
  target/      was used to build static libraries for ros software
    include/   contains headers
    lib/       contains static libraries
  roscpp_android_ndk/     is a NDK sub-project that can be imported into an NDK app
  sample_app/  is an example of such an app, a native activity
  sample_app/bin/sample_app-debug.apk  is the built apk
}}}

This means that all the ROS packages have been correctly built. Congratulations!