Running Kotlin Applications on a headless Raspberry Pi and other embedded systems

Kotlin is way more than just an Android programming language. And to show you I’ll explain how you can run Kotlin Applications on a headless Raspberry Pi.

Preparing a Raspberry Pi

I won’t go into much detail on how to setup a Raspberry Pi nor how to configure it’s network settings or connect remotely. For that you can go to this official raspberry pi getting started documentation. Not all system images come with a JDK included, you can check with java version or install using the package manager.

sudo apt update
sudo apt install default-jdk

If default-jdk fails you’re probably on an older Raspberry Pi that doesn’t support the latest Java SDK. To fix this install openJdk 8 instead with below command. I had to do so on my Raspberry Pi Model B.

sudo apt install openjdk-8-jdk

By the way this is how you find out what model you have

pi@raspberrypi2:~ $ cat /proc/cpuinfo
processor : 0
model name : ARMv6-compatible processor rev 7 (v6l)
Hardware : BCM2835
Model : Raspberry Pi Model B Rev 2

Preparing Development Environment

Next step is to prepare the development environment. In similar fashion as to how you would be programming with Android Studio IDE and publish apps to an Android Emulator or device using adb you can get an IntelliJ installation with the Embedded Linux JVM Debugger Plugin. That step is technically not required but will make this development so much easier.

On your development machine install IntelliJ Community edition after downloading it from here. So far so good. Once installed use this link to the Embedded Linux JVM Debugger Plugin or you should be able to find it from the IntelliJ launch screen picking the Plugins tab searching for “embedded linux”. See below screenshot.

Creating your First Project

From that same launch screen you can also create a new project form the first Projects tab. In doing so you can enter a name for your project, select Kotlin language and gradle build system and so on. For this project to work as a headless kotlin application on a Raspberry Pi you should go to Kotlin Multiplatform tab next to pick the Console Application JVM project template. At this point you’re ready to hit next followed by Finish on the next screen.

Now in the Project view select the src > main > kotlin > Main.kt file to start. In order to launch this app you can use the green arrow next to the Configurations drop down on the top right. Note that this will give you an execution on your development machine. To run it on the Raspberry Pi you’ll have to create a new Configuration using Edit Configurations from that list. In the new screen use the add new... options or the + icon.

Then pick the Embedded Linux JVM template and complete with all the connection details for your Raspberry Pi. If that option is not enabled make sure you’ve restarted IntelliJ after the plugin install and that the gradle system has finished building.

That’s it. If you execute that run configuration you’ll now see a run screen publishing code to the raspberry pi, compiling and running it there.


I ran in a Java version issue still when executing due to my older Raspberry Pi model. The reason was I installed the default jdk first and then openjdk-8. Instead of showing the me Hello World! sentence it would render an error Server VM is only supported on ARMv7+ VFP.

In order to specify which java version to compile and run with by default you can use the command below.

sudo update-alternatives --config java

Next Steps

For my personal usecase I’ll be looking at this bluetooth multiplatform library. It includes a Raspberry Pi specific example but a quick look reveals that it is using JavaFX so requires a screen for rendering the result. Instead this is how I’ll start working on my BLE Energica connection from the Raspberry Pi that remains on the bike while riding.

To control GPIO pins on your Raspberry Pi you can look into Pi4J and Pi4K libraries. Publishing can be done as a .jar file using the ShadowJar Gradle plugin.

Leave a Reply

Your email address will not be published. Required fields are marked *

Please reload

Please Wait