What i’ve been up to

I’ve been in stealth mode for almost two months now (with a wedding somewhere in between the busy days). Some have already wondered what i’m up to due to my mysterious and at times mad-manish babbling on Twitter. Today i can finally announce what i’m working on!

That’s right, i’m working on RoboVM! It all began when Niklas send out a job ad sometime in May/June for the position of a developer based in Sweden, with some interesting skills. Jokingly i replied to the ad, saying that i lack any kind of swedish skills. After some back and forth it turned out that i may be a good fit and we agreed to collaborate.

I started working full-time on RoboVM by the end of July, learning the ins and outs of RoboVM and all technologies attached to it (mainly LLVM). It’s been a blast so far. Technology-wise, i’ve learned more in the last few weeks than in the last two years at my old job, where i was mostly concerned with management tasks. I’m finally back to full-time coding and it’s been extremely satisfying so far.

Getting into the code-base was one of my biggest concerns before starting at RoboVM. I’ve worked on quite a few legacy projects over the years, and it has often been a struggle due to shitty code, architecture astronauts going berserk or simply the shear amount of code. I’m probably also responsible for a few mental breakdowns of others who have to maintain my code. Interestingly enough, getting into the RoboVM code base turned out to be quite a smooth ride so far. This is especially surprising to me as i have to touch a multitude of different technologies and languages along the way. I guess this is a testament to the engineering effort that Niklas has put into it so far. My previous adventures into building a JVM also helped a little. Getting paid to work on something like RoboVM has always been a bit of a dream for me. I guess i’m pretty happy at the moment, even though this is probably the toughest thing i’ve worked on in my life so far.

I’m working remotely for RoboVM, which has resulted in a bit of a life-style change as well. I can now work from anywhere at any time. I found a new home at the office of BYTEPOETS here in Graz for when i’m sick of being alone. They are an amazing start-up in the web and mobile space. Seeing their processes at work is pretty fantastic and enlightening. I get to know a lot of new talented folks with interesting stories to tell. If your business is in need of services in the web and/or mobile space, check them out (and i don’t say this because they let me sit in their office). Seal of approval from me! When working from home it can become hard to differentiate between work time and free time, but i guess that will work out eventually as well. It definitely helps having an office to go to. Gives me a feeling of closure for the day when i leave.

I can’t tell what exactly i’m currently working on, but i hope it will make your life easier once it’s complete and working. The pressure is on, wish me luck :)

Ingress launches on IOS – powered by libGDX

Google’s augmented reality game Ingress has launched on iOS. It appears to be using libGDX on iOS as well, which means it either runs on the old Xamarin backend or our more stable and faster RoboVM backend (performance seems to indicate the latter). Here’s a pic of the credits on my old iPad2:

It’s gonna be interesting to follow the reviews on the App Store.

Libgdx updates to RoboVM 0.0.11, featuring new CocoaTouch bindings!

Niklas Therning of RoboVM fame send us a tasty pull request a few days ago that updates our RoboVM backend to the latest RoboVM version. I held off merging this PR until today when Niklas released RoboVM 0.0.11. The new CocoaTouch bindings, exposing iOS APIs to you, are now under a new package called org.robovm.apple. This means that your RoboVM starter classes need to be adapted a tiny little bit!

This:

package com.badlogic.gdx.tests;

import org.robovm.cocoatouch.foundation.NSAutoreleasePool;
import org.robovm.cocoatouch.uikit.UIApplication;

import com.badlogic.gdx.backends.iosrobovm.IOSApplication;
import com.badlogic.gdx.backends.iosrobovm.IOSApplicationConfiguration;

public class IOSRobovmTests extends IOSApplication.Delegate {
	
	@Override
	protected IOSApplication createApplication() {
		IOSApplicationConfiguration config = new IOSApplicationConfiguration();
		return new IOSApplication(new BulletTestCollection(), config);
	}

	public static void main(String[] argv) {
		NSAutoreleasePool pool = new NSAutoreleasePool();
		UIApplication.main(argv, null, IOSRobovmTests.class);		
		pool.drain();
	}
}

Becomes this:

package com.badlogic.gdx.tests;

import org.robovm.apple.foundation.NSAutoreleasePool;
import org.robovm.apple.uikit.UIApplication;

import com.badlogic.gdx.backends.iosrobovm.IOSApplication;
import com.badlogic.gdx.backends.iosrobovm.IOSApplicationConfiguration;

public class IOSRobovmTests extends IOSApplication.Delegate {	
	@Override
	protected IOSApplication createApplication() {
		IOSApplicationConfiguration config = new IOSApplicationConfiguration();
		return new IOSApplication(new BulletTestCollection(), config);
	}

	public static void main(String[] argv) {
		NSAutoreleasePool pool = new NSAutoreleasePool();
		UIApplication.main(argv, null, IOSRobovmTests.class);		
		pool.close();
	}
}

Both IOSApplication and NSAutoreleasePool have to be imported from the new package. NSAutoreleasePool#drain() has now become NSAutoReleasePool#close().

I also updated our Gradle templates to use the latest Gradle RoboVM plugin (0.0.6) and our Maven POMs to depend on the latest RoboVM version in Maven Central. Give it an hour or two to distribute into the nightlies, build on our build server sponsored by our awesome community via Patreon!