« iPod touchでワイヤレスヘッドフォンを接続する - サンワサプライ MM-BTAD10BK | トップページ | Java SE 6 Developer Preview 8 for Leopard »

iPhone/iPod touch用Java SE実行環境:JocStrapでJavaからUIKitが利用可能に

Jay Freeman (saurik)氏は、iPhone/iPod touch用Java SE環境(JamVM+GNU Classpath)で、GUIを含む各種Objective-CフレームワークをJavaから利用する事ができるJava Objective-CバインディングライブラリJocStrapを公開しています。

現在、iPhone用のアプリケーション開発ツールとしては、gccクロスコンパイラ、Python、Perl、Rubyなどがあります。しかし、iPhone/iPod touch単体でUIKitを使用したGUIアプリケーションを開発できるスタンドアロン開発環境は、現状JamVM+GNU Classpath+JocStrapの組み合わせだけです。

JocStrapを利用する場合は、以前のエントリ「iPhone/iPod touch用Java SE実行環境(JamVM+GNU Classpath)」に従ってsaurikのレポジトリを設定することで、Installer.appからインストールすることができます。なお、パッケージの依存関係には明示されていませんが、JocStrapはランタイム時にAPR、libffiおよびUICaboodleを必要としますので、合わせてインストールしておきます。

JocStrapのObjective-Cバインディングは、Mac OS X用のCocoa Javaフレームワークとは全く異なります。Cocoa Javaフレームワークは、Objective-CのクラスライブラリをJavaらしいプログラミングスタイルに合わせてデザインされたものです。一方、JocStrapはObjective-Cのクラスライブラリを機械的にJavaライブラリにマッピングしたものとなっているため、アプリケーションの記述スタイルはJavaのシンタックスでありながら、良くも悪くもObjective-Cライクなソースコードに近いものになります。例えば、NSAutoreleasePoolオブジェクトの初期化処理はObjective-Cでは、

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

のように記述しますが、これをJocStrapを使用してJavaで記述すると以下のようになります。

NSAutoreleasePool pool = (NSAutoreleasePool) new NSAutoreleasePool().init();

通常、Objective-Cにおけるオブジェクトの初期化はallocとinitの2つのオペレーションのペアによって行われますが、Javaの場合もデフォルトコンストラクタの後にinit()メソッドを実行する事になります。ここでJavaプログラマは、init()の戻り値を明示的にNSAutoreleasePoolでキャストしている点が不思議に思われるかもしれません。Objective-Cはコンパイラ言語でありながら、強いリフレクションの性質を持っており、initの結果として自分自身以外のオブジェクトを返すことが許されています。JocStrapのObjective-Cバインディングもこの性質を引き継ぐため、init()メソッドの戻り値もObject型で宣言されています。Javaは強い型付けの言語であるため、実際に返されるオブジェクトの型に合わせてダウンキャストが必要になるわけです。

また、Objective-CはSmalltalkと同じように、オブジェクトのメソッド宣言には名前付きパラメータ形式を採用しおり、同じ引数型の並びであってもパラメータ名が異なっていれば、メソッドのオーバローディングができるようになっています。

- (void)send:(id)mail to:(id)address;
- (void)send:(id)mail with:(id)signature; 

一方、Javaのメソッド呼び出しではパラメータに名前をつけない仕様であるため、Objective-Cクラスバイディング時のメソッドの衝突を避けるため、Objective-Cクラスにおけるメソッド名とパラメータ名を全て繋ぎ合わせたものをJavaのメソッドにマッピングしています。

public void send$to$(Object, Object);
public void send$with$(Object, Object);

また、Window Serverからのイベントメッセージを受け取るアクションメソッドには、@Messageアノーテションを付与する必要があります。

@Message
public void applicationDidFinishLaunching$(Object unused) {...}

上記のようないくつかのルールがありますが、Objective-Cの知識さえあれば、比較的ストレートにJavaでアプリケーションを記述することができます。現在のバージョンでは、UIApplicationMainクラスが自動検出できなかったために、ブートストラップのためのコードが若干醜くなってしまうようですが、Objective-CネイティブのHello Worldが、Java版のHello Worldに変換してきちんと動いているのは立派です。

まだまだ改善の余地が沢山あるJocStrapですがとても興味深いプロジェクトだと思います。

|

« iPod touchでワイヤレスヘッドフォンを接続する - サンワサプライ MM-BTAD10BK | トップページ | Java SE 6 Developer Preview 8 for Leopard »

ipod」カテゴリの記事

java」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/181807/17362896

この記事へのトラックバック一覧です: iPhone/iPod touch用Java SE実行環境:JocStrapでJavaからUIKitが利用可能に:

« iPod touchでワイヤレスヘッドフォンを接続する - サンワサプライ MM-BTAD10BK | トップページ | Java SE 6 Developer Preview 8 for Leopard »