Search code examples
javajava-mebytecodedowngrade

Downgrade Java code 1.5 to 1.4 (bonus points: J2ME, Blackberry!!!)


I want to port some existing j2se libraries (e.g. Apache Compression libs) to use for Blackberry development, but there is a catch (and not just one).

First, most java libs extensively use j2se collections and data types that are typically missing on j2me platforms — but that's theoretically solvable thanks to open-source j2se api implementations like Apache Harmony. The bigger problem is that, it seems, Blackberry JDK is based on java 1.4, so any code that uses generics and other 1.5 features, like Enums, is not effortlessly compilable on Blackberry.

Which raises an interesting question of whether there are any existing tools or projects out there that would do automatic 1.5->1.4 conversion, while supporting j2me-bastardized bytecode :)

One project I was able to find is Retroweaver, but I'm not quite sure how active that project is.

I'm sure the problem of 1.5->1.4 automatic conversion isn't unique -- so does anybody have any experience with it?


Solution

  • So here's what I ended up doing so far: Declawer + some custom code for enumeration classes generation.

    The one differentiating thing about Declawer is that, although it's very simple and, frankly, a bit of a hack (it relies on an undocumented capability of JavaC), its output is actual Java code as compared to enhanced or converted Java bytecode. That's very precious for mobile java-based development as, frankly, bytecode modification/instrumentation is not at all as developed for j2me platforms as it is for j2se, and there are just no guarantees that things are going to work out of the box the way they do with j2se where these tools have already been used by quite a few developers.

    Declawer's functionality is limited (no love for 1.5 enums or autoboxing), so I had to add a python script to automatically generate classes equivalent in functionality to 1.5 enums from simple descriptors. This generation happens at build time.

    This addresses my concerns so far, with the only exception of finding a good j2me-friendly IoC container to use for my app (once you try these guys, it's so hard to give them up.)

    But that's a discussion for a different thread.