GoogleはソースコードをJavaからiOSプラットフォーム向けObjective-C/C++に変換するJ2ObjC transpilerをオープンソース化した。
J2ObjCのwikiによると、このプロジェクトはWeb、Android、iOSアプリケーションといった異なるコードベースを扱うことへの不満から始まったようだ。GWTベースのWebクライアントアプリはAndroidアプリとUI以外のコードを共有できるが、iOS向けにはスクラッチから書き直す必要があった。J2ObjCはこの問題を一部解決する。このツールを使うと、ビジネスロジックが書かれたJavaコードを編集不要で使えるObject-C/C++に変換できる。ただしiOSのUIコードは生成してくれない。作者らは「世界に通用する、高速なiOS UIを得る唯一の方法は、AppleのiOS SDKフレームワークを使ってObjective-Cで書くこと」であり、またそうしたコードを扱うのは複雑だと考えているためだ。
理論的にはサーバサイドのコードも変換可能だが、現在のところJ2ObjCはクライアントサイドの開発のみサポートしている。生成されたコードはiOS Foundation Frameworkを使っており、別のmakefileを使った外部ビルドプロジェクトを通して、あるいは、既存のプロジェクトにビルドルールを追加することで、Xcodeと統合できる。ほかのiOSアプリと同様、生成されたコードはXcode Instrumentsを使ってプロファイル、テスト、アナライズできる。
J2ObjCはObjective-Cコードを生成するのに、いくつものステップを踏んでいる。
- デッドコードの削除: JARファイルから使われていないコードを削除する。
- Rewriter: スタティック変数など、Objective-Cに等価なものがないJavaコードを書き直す
- Autoboxer: 数値プリミティブ値をボックス化するコードと、数値ラッパークラスを非ボックス化するコードを追加する。
- IOS Type Converter: JavaからFoundationクラスに直接マップされる型を変換する。
- IOS Method Converter: メソッド宣言と呼び出しを等価なFoundationクラスメソッドにマップする。
- Initialization Normalizer: 初期化文をコンストラクタとクラス初期化メソッドに移す。
- Anonymous Class Converter: 匿名クラスを内部クラスに変更する。そのクラスによって参照されるfinal変数フィールドも含まれる。
- Inner Class Converter: 同じコンパイル単位にあるトップレベルクラスから内部クラスを取り出す。
- Destructor Generator: 選択されたGCオプションに応じて、deallocもしくはfinalizeメソッドを追加する。
JavaコードをObjective-Cに変換する上で大きな問題のひとつは、ガベージコレクションだ。J2ObjCは複数の方法で使われていないオブジェクトを管理できるが、デフォルトでは自動リリースプールを使った参照カウントを使っている。
J2ObjCはまだアルファレベルだが、すでにGoogle内のいくつかのプロジェクト(詳細不明)で使われているようだ。
よく似たツールとしてはXMLVMがある。これはJava、.NET、Rubyバイトコードを.NET、Javaバイトコードに、あるいはJavaScript、Python、Objective-C/C++ソースコードに変換するクロスコンパイラだ。名前からわかるように、XMLVMはもとのバイトコードをXMLに変換し、それを後で別のVMのバイトコードや、WebやiOSアプリケーションのソースコードへと変換する。