JavaFX on Raspberry Pi – 3 Easy Steps [updated]steveonjava | December 18, 2012
Note: Updated for NOOBS and Java 8 EA [changes highlight in red]
The long awaited early access of JavaFX on Raspberry Pi is finally out. This is a great platform for doing small embedded projects, a low cost computing system for teaching, and great fun for hobbyists. It only costs $35 for the Model B version with 512MB RAM, 700MHz ARM processor and I/O for HDMI, Composite, Audio, Ethernet, and 2 USB ports.
So what can you do with JavaFX on a Raspberry Pi? A great example is the digital signage that we put together for Devoxx showing the conference schedule flying by on animated space ships:
Update: And if you are not convinced that Java is performant on the Pi, check out Rich Bair’s post on fxexperience.com: http://fxexperience.com/2012/12/javafx-on-raspberry-pi/
So if you are convinced to get started, there are 3 easy steps to get JavaFX running on your Pi:
- Install Linux on your Raspberry Pi
- Download and copy Java/JavaFX 8 to your Pi
- Deploy and run JavaFX apps on your Pi
This does assume you have a Pi… For questions about where to get a Pi, how to power it, etc., I would recommend checking out the Raspberry Pi Site.
Step 1 – Installing Linux on Your Raspberry Pi
The latest Java 8 release is hard float, which is a good thing, because it gives you better performance and the recommended Raspberry Pi build is also hard float. Stay away from anything that says soft, softfp, etc., because it will be incompatible with the hard float JVM.
Note: Why all this fuss over floating point? Well, low power embedded systems skip the floating point hardware to save cost (e.g. ARM Cortex M0-M3). Fortunately the ARMv6 chip used in the Raspberry Pi has real floating point support.
To setup Linux on your SD card, you will need a Windows, Mac, or Linux desktop with an SD Card Reader/Writer. There is a new installer called NOOBS that will download and setup your Pi for the first found here:
Once your SD card is formatted and you have copied over NOOBS, take your Raspberry Pi out of the box, pop in the SD Card, hook it up to a monitor or TV lying around your place, and plug it up to a nice usb power brick (5V 700mA or greater).
Warning: Order Matters! – If you don’t hook up an HDMI monitor before powering on the Pi, it assumes composite. This means if the lights are flashing but you get a blank screen, you should try rebooting the Pi (by unplugging and replugging it in).
At this point, your Pi should bootup and show you the NOOBS installation screen. I recommend going with the Raspbian Wheezy installation (default), which will start downloading and automatically install once you select it.
After the image is copied the Pi will reboot into the raspi-config utility. There are some things you might want to consider tweaking here, including:
- Change the locale/keyboard/timezone – Default settings are for the UK, so everyone else should change these or you will be cursing at your keyboard when trying to type punctuation!
- Advanced Options:
- CPU/GPU memory split – Give the GPU at least 128MB of ram so graphical heavy apps will run better (important for JavaFX!)
- Overscan – If your display has black bars around the edges, turn this off so you can use the full resolution.
Expand root filesystem – It can do an online resize of your card to use the full space (default image has a tiny 2GB root partition). Highly recommended, but expect this to take a while on a large card.[no longer needed with NOOBS]
- SSH – Turn this on if you want to access your Pi over the network (this is the only way to shut down rogue JavaFX processes short of rebooting)
In the official JavaFX Raspberry Pi docs they also recommend hacking the framebuffer to be 720p in the config file (/boot/config.txt) by uncommenting these lines:
This is not strictly required, but will give you better performance since the Pi is pushing fewer pixels. If you are going to do this, you might also want to force the Pi to run in 720 resolution as well to avoid pixel upscaling. Don’t try hacking the display settings unless you know what you are doing (and have an ssh terminal to login remotely in case you kill the display). For more info about the HDMI display nodes, check out the docs here.
Step 2 – Download and Copy Java/JavaFX 8 to Your Pi
Choose the Linux ARMv6/7 VFP, HardFP ABI download option.
If your Pi is hooked up to the network via ethernet you can download it directly to the device. Otherwise copy it over using sftp (via ssh) or sneakernet (a USB key).
Once you have it downloaded, you can unzip it to a location of your choice:
sudo tar -zxvf file_name -C /opt
And then to run java use a command like the following:
sudo /opt/jdk1.8.0/bin/java -version
Step 3 – Deploy and Run JavaFX Apps on Your Pi
Almost any JavaFX desktop application will run on the Pi simply by copying over the jar file and executing it locally, with no modifications. (The 2 exceptions to this are applications that rely on WebView or MediaView, both of which are unimplemented in the current dev preview)
A great way to get started building JavaFX applications for the Pi is to use Scene Builder to quickly put together a user interface visually, and then deploy that to the Pi. I did this last night at the Linux Users’ Group of Davis (LUGOD), quickly putting together a sample application with help from the very astute attendees (I also learned a thing or two about linux command tricks along the way from the audience).
I posted our 15 minute application in GitHub as an example you can try:
To run it on the Pi, build the source with your favorite IDE (or straight form the command line) and build a jar file (make sure you use the same Java 8 version on desktop that you are deploying to the Pi). Then copy the jar file to your Pi and run it with a command like the following:
<span style="color: #ff0000;">/opt/jdk1.8.0/bin/java -jar LUGODTest.jar</span>
Here is a picture of the Scene Builder project and the output we got on the Raspberry Pi during the LUGOD meeting:
However, the most impressive demo is your own. Try deploying your own JavaFX applications and leave others pointers to apps you have deployed in the comments below!