goldstift's 2 cent on technology and software development

Navigation

Ubuntu and Java on Nexus7

In this blog post I describe how to setup Ubuntu Linux and Oracle Java on my newly acquired Google Nexus7 device. This shall be the foundation to checkout the things you can do with JavaFX on a Tablet computer.

My environment is a Macbook Pro (MBP) running on OS X 10.8 (Mountain Lion). The Nexus 7 (in my case the 16gb version) is attached to the MBP via its USB cable.

Download images for your Nexus

Visit the following URL and download boot.img and rootfs.img appropriate to your device's hardware setup http://hwe.ubuntu.com/uds-r/nexus7/

Download Android Development Tools

To install the Ubuntu image on your Nexus 7 we need the "fastboot" command line utility from the Android Developer Tools. You can either choose to download the Android Developer Tools from the Android website or use a customized download of "fastboot" from github:

Installation of the Ubuntu image

Now you need to shutdown your Nexus. When it's shut down connect it via USB to your Mac or PC and bring up the Bootloader (a.k.a. "fastboot") by holding down the "Vol -" button and then pressing the power button. The Ubuntu Nexus7 Wiki has a nice screenshot of the screen that should be visible

Next you need to verify that your Mac (or PC) can access your device via USB and fastboot. Therefore do the following

$ cd /Users/ahe/dev/tools/adt-bundle-mac/
$ sdk/platform-tools/fastboot devices
  1234567891234567        fastboot

The ladder line displays the serial number of your device. Be sure to check it's the correct device by comparing it to the serial on your device's bootloader screen.

If not already done you need to unlock your device to be able to install another operating system at all (Please note that you might lose your warranty by this action!):

$ sdk/platform-tools/fastboot oem unlock

You should immediately see a dialog popup on your device asking whether you really want to unlock (see screenshot from Ubuntu Nexus7 Wiki). Afterwards the unlock process should begin and finish without any error, so you are able to reboot your device into bootloader again:

$ sdk/platform-tools/fastboot reboot-bootloader

If you now look closely at your device there should be a line saying "LOCK STATE - UNLOCKED".

Now you can install the images

$ sdk/platform-tools/fastboot flash boot UbuntuNexus7/boot.img 
$ sdk/platform-tools/fastboot flash userdata UbuntuNexus7/rootfs.img 
$ sdk/platform-tools/fastboot reboot

If you encounter an error like the following sending 'userdata' (104285 KB)… FAILED (remote: (Nv3pBadReceiveLength)) it means that your USB connection timed out. In this case you need plug out and in the USB cable of your Nexus7 and repeat the least entered command.

Your device should then boot into Ubuntu. NOTE: The first boot takes about 2-4 minutes as the bootloader has to prepare the system.

System stabilization

Once booted and logged in we have to open a terminal window by clicking on the Ubuntu Dash icon (upper left corner) and typing "Terminal" into the search field. In case you cannot type because the onboard keyboard doesn't appear, you can manually trigger it by clicking on the little icon with the 4 squares in the upper menubar and choosing the "Show Onboard" option.

The first step in the Terminal is to update all your system packages:

$ sudo apt-get update
$ sudo apt-get upgrade

Install bluetooth keyboard

You can read the details on this step here: https://wiki.ubuntu.com/Nexus7/UsingTheDevice

Install the alternative bluetooth daemon

$ sudo apt-get install bluez-compat

Scan for your bluetooth device

$ hcitool scan
Scanning ...
 20:42:A1:00:66:78       bluetooth keyboard

Connect your device via its ID

$ sudo hidd --connect 20:42:A1:00:66:78

The following link has a longer description on how to add a bluetooth keyboard at system start: http://askubuntu.com/questions/17504/how-can-i-have-a-bluetooth-keyboard-auto-connect-at-startup

Install OpenSSH as recovery console

To be able to interact with the device when the X11-Server crashes (or you chose an unusable Desktop environment - like me I wanted to try "Openbox") your first step should be the installation of the OpenSSH server.

$ sudo apt-get install openssh-server

Via "ipconfig" you get the ip of your device and can login from a remote machine (username: ubuntu; password: ubuntu).

Decrease memory consumption

On of the Known Issues is a quiet large memory consumption of the unity desktop. To compress memory and decrease memory consumption you can install the following

$ sudo apt-get install zram-config 

Another way would be to install a more lightweight desktop environment like LXDE $ sudo apt-get install lxde

Installing Oracle Java

For my installation I used Oracle JDK 7 (1.7.10 Developer Preview available here: http://jdk7.java.net/fxarmpreview/)

$ sudo mkdir -p /opt/java
$ wget http://www.java.net/download/JavaFXarm/jdk-7u10-ea-fx-8_0_0-embedded-linux-arm-sfp.tar.gz
$ sudo tar xzvf jdk-7u10-ea-fx-8_0_0-embedded-linux-arm-sfp.tar.gz -C /opt/java

Finally we need to add the JAVA_HOME variable to the .bashrc file so it is set for every shell session

$ echo export JAVA_HOME=/opt/java/jdk1.7.0_10 >> ~/.bashrc
$ echo export PATH=\$JAVA_HOME/bin:\$PATH >> ~/.bashrc

If you now try to start java you should get an error like the following

/opt/java/jdk1.7.0_10/bin/java: No such file or directory

or if you're already one step further this one

/opt/java/jdk1.7.0_10/bin/java: error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: No such file or directory

I'm totally new to the embedded business so please spare me, but as far as I found out, the above mentioned java version goes well with ARM softfp shared libraries for armhf. So we need to install a special version of libc6 for java on our Nvidia Tegra (ARM Cortex-A9) and also the according "gcc1" version:

$ sudo apt-get install libc6-armel libsfgcc1

After this you should be able to run the "java" command successfully:

$ /opt/java/jdk1.7.0_10/bin/java -version
  java version "1.7.0_10-ea"
  Java(TM) SE Runtime Environment (build 1.7.0_10-ea-b08)
  Java HotSpot(TM) Client VM (build 23.6-b03, mixed mode)

To be continued…

As this post is already rather long, I'll continue the findings on JavaFX in a follow-up post. In the meantime you can follow me on Twitter to stay up to date.

Any comments, optimization requests and suggestions are very warm welcome!

My next Conferences