JRuby on Android (from: What would you like to know about Jruby?)

In "What would you like to know about Jruby?", Charles wrote:

We get a lot of questions about whether JRuby could work on Android et al, and though we're not working on it it's most definitely possible.

Is this just a claim or did you have a deeper look into the platform(s)? My experiences with Android are rather bad on that respect. The first problem is that Android only implements Java 1.4.2. That means, that you have to base it on JRuby 1.0.x or some backporting toolchain. On top of that it is not at all complete, especially when it comes to Reflection, Classloading and other parts of the Standard Library. I tried to get JRuby 1.0.x running on Android 0.8 for some time and came to the conclusion that this will only work with non-trivial tampering on JRuby and the libraries it depends on.
Granted, I am not a JRuby Hacker and my insight is flawed. Is there any chance to get JRuby running on Android without transforming it into a package that cannot be called "JRuby" anymore? Has anyone else tried it?

Regards,
Florian Gilcher

Florian Gilcher wrote:

In "What would you like to know about Jruby?", Charles wrote:

We get a lot of questions about whether JRuby could work on Android et al, and though we're not working on it it's most definitely possible.

Is this just a claim or did you have a deeper look into the platform(s)? My experiences with Android are rather bad on that respect. The first problem is that Android only implements Java 1.4.2. That means, that you have to base it on JRuby 1.0.x or some backporting toolchain. On top of that it is not at all complete, especially when it comes to Reflection, Classloading and other parts of the Standard Library. I tried to get JRuby 1.0.x running on Android 0.8 for some time and came to the conclusion that this will only work with non-trivial tampering on JRuby and the libraries it depends on.
Granted, I am not a JRuby Hacker and my insight is flawed. Is there any chance to get JRuby running on Android without transforming it into a package that cannot be called "JRuby" anymore? Has anyone else tried it?

Admittedly, I have not spent a lot of time looking at Android, but I'm certain it would be possible to produce a modified version of JRuby that could run on it. In the end, there's only a few key pieces that would need to work:

- The code would either need to be always interpreted or precompiled, since we can't generate Java bytecode on Android at runtime.

- We would need to trim the core classes to those that would work on Android, and then to methods supported by Android.

- Finally, we'd need a bytecode backporting tool if 1.5 bytecode was not acceptable. There are various "retro" tools that do a pretty good job.

So it's certainly possible, but I don't think anyone's started looking at it. It would take a bit of work.

- Charlie

First of all, thanks for the answer. As I see, it is not just a wild guess.

Admittedly, I have not spent a lot of time looking at Android, but I'm certain it would be possible to produce a modified version of JRuby that could run on it. In the end, there's only a few key pieces that would need to work:

- The code would either need to be always interpreted or precompiled, since we can't generate Java bytecode on Android at runtime.

Okay, this was the first problem I ran into. But i had a hard time to asses how far JRuby depends on this. So I lost interest (you know... fun project). Do you think this is solvable in a clean way with not too much of work?

- We would need to trim the core classes to those that would work on Android, and then to methods supported by Android.

Trimming the package would be needed anyways, I don't see a problem there.

- Finally, we'd need a bytecode backporting tool if 1.5 bytecode was not acceptable. There are various "retro" tools that do a pretty good job.

I played around with some, but they were a bit troublesome. The biggest problem is that they generate JVM Bytecode which is different from the Bytecode the Android VM uses. There is a converter, but I had my problems with that one, too.

So it's certainly possible, but I don't think anyone's started looking at it. It would take a bit of work.

- Charlie

Thanks for the info. Maybe I will have a look into it again.

Regards,
Florian Gilcher

ยทยทยท

On Nov 19, 2008, at 2:04 PM, Charles Oliver Nutter wrote:

Florian Gilcher wrote:

- The code would either need to be always interpreted or precompiled, since we can't generate Java bytecode on Android at runtime.

Okay, this was the first problem I ran into. But i had a hard time to asses how far JRuby depends on this. So I lost interest (you know... fun project). Do you think this is solvable in a clean way with not too much of work?

I believe so. We'd just want to pull off the compilation and code generation bits into separate modules we load through reflection or something similar. I've thought through a few scenarios.

- Finally, we'd need a bytecode backporting tool if 1.5 bytecode was not acceptable. There are various "retro" tools that do a pretty good job.

I played around with some, but they were a bit troublesome. The biggest problem is that they generate JVM Bytecode which is different from the Bytecode the Android VM uses. There is a converter, but I had my problems with that one, too.

Perhaps the SDK has improved since? Up until recently we had support for retroweaving in the JRuby builds, though we didn't actually test against it.

- Charlie