タイトルBrowsing Mac OS X》Mac OS Xのネイティブ機能を利用するMRJはまだ問題もカテゴリーJava
作成日2001/4/11 14:26:59作成者新居雅行
Mac OS X向けのアプリケーションを作成する場合に、Javaを使うという選択肢が現実的なものとなっている。Cocoa対応のアプリケーションをJavaで作るということだけでなく、Javaの標準ライブラリの機能を使って、アプリケーションなどを作成できる。つまり、プラットフォームごとに共通のクラスライブラリを使ったプログラミングができるのだ。ユーザインタフェースではJFCのSwingを使うことが今では一般化しているが、Mac OS XのAquaに対応したルック&フィールが用意されているので、そのルック&フィールを適用するだけで、Swingで作ったアプリケーションのユーザインタフェースはAquaになる。プログラムの最初に、以下のようにシステムのルック&フィールを適用するという記述を加えておけば、あとはSwingに従ってプログラムを作成すれば、Aqua対応になるわけだ。

try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
} catch(Exception e) { //例外処理は適切に
System.out.println(e.getMessage());
}

Swingを始め、Javaのクラスライブラリは豊富な機能を有するため、もちろん、まとまったアプリケーションは十分に作成できる。Javaは機能不足と言われていたのは初期の頃だけの話で、今ではOSのネイティブ機能の多くをカバーできるまでにライブラリは発達している。
ただし、標準の機能でカバーしきれない部分も、もちろんある。そのために、JDirect3あるいはJNIといった仕組みを用意し、OSのAPIコールを行ったり、あるいは別途C言語などで作ったライブラリの呼び出しなどができるようにもなっている。こうした処置がどうしても必要になる時はある。もちろん、その部分はOSに依存することになるので、クロスプラットフォームで稼動させるアプリケーションではOSごとにプログラムをわけるなど、対処が必要になってくるところである。しかしながら、ポインタの使い方が今までの開発言語と大きく違うJavaだけに、つなぎの部分のプログラムはけっこう複雑になりがちである。
Macintoshでも、Mac OSの独自の処理を、アプリケーションが必要とする場合があり、もちろん、それらはJavaの標準クラスライブラリでは提供されていない。それらをJDirect3やJNIで作るとなると、プログラム作成効率はぐっと落ちることもあって、Mac OSでは、MRJ(Mac OS Runtime for Java)として提供しているJavaの実行環境に、Mac OS独自の機能を使いやすくするライブラリを入れている。たとえば、ファイルタイプやクリエイタといったMac OSにしかない機能はJavaの標準ライブラリでは当然のごとく用意されていない。そこで、MRJのライブラリ機能として、ファイルタイプやクリエイタを設定するというメソッドを提供することで、手軽にMac OS独自の処理を、Javaのプログラムに組み込める。しつこいようだが、その部分はWindowsで動かしてもエラーになってしまうだけなので、クロスプラットフォームを目指す場合には配慮は必要になる。

Mac OS XでのJava関連のドキュメントは、以下のアドレスにある。

◇Java Developer Documentation
 http://developer.apple.com/techpubs/java/index.html

この中にある「Mac OS X GM Release Notes:Java」をまずはチェックしよう。MRJ 3.0というバージョンが組み込まれている。(Mac OSではVer.2.2.4までリリースされている。)Internet Explorer 5.1ではアプレットの利用はできないことや、HotSpot対応のVMであること、スレッドはMachのスレッドに直接展開されるのでプリエンプティブであることなどがこの文書から得られる。ほかにも、コンパイルやシステムプロパティなど、簡潔ながら必要なことはだいたい書かれている文書だから、Javaでのプログラムを行う人は、なにか情報がないかまずはこの文書からチェックしていいくらいだ。
実際にプログラムを作る上で使うライブラリ機能は、MRJToolkitという部分に記載されている。Release Noteは特別な事情だけが記載されているので、詳細はJava Developer Documentationのページから「MRJToolkit」を参照すると良いだろう。ここでの機能を見て行きたい。まず、ファイルタイプやクリエイタを設定するメソッドがある。既存のファイルに対して設定したり、取得することができるが、ファイルの指定は、java.io.Fileオブジェクトでできるので、Javaのプログラムから手軽に利用できる。ただし、筆者が作ったプログラムで試した限りは、31バイトを超える(おそらくはFSSpecレベルで)ロングファイルネームで、しかもその中に漢字などの3バイトコード(UTF-8だからこう呼ぶのが適切だろう)を含むものの場合、ファイルタイプの設定でエラーが出て設定ができなかった。現在のところは回避方法は分からないし、いずれ修正されるのかどうかも不明だ。なお、アプリケーションが書き出すファイルの既定のファイルタイプやクリエイタを設定するメソッドが、MRJ 2.2.xまでは存在していたが、このメソッドは、Mac OS X以降は使えなくなっていることがRelease Noteに記載されている。既定のファイルタイプとクリエイタという言い方が適切かはさておいて、Javaでファイルを作成した場合のファイルタイプとクリエイタはそのままでは、00コードだけ4つ並ぶものとなっている。
MRJToolkitでよく使う機能としては、FinderからのOpenDocumentsのAppleEventに対応するものだ。また、QuitApplicationへの対応も必要である。さらに、Aboutメニューを選択した時のハンドラも作成する必要がある。これらは、規則通りにプログラムを組めば、こうしたアクションが発生すると規定のメソッドが呼び出されるという仕組みだ。プログラムの書き方はちょっと違うが、Javaのイベント処理に近い。ここでも筆者がサンプルとして作ってみたアプリケーションでは問題が見られた。QuitApplicationのイベント処理やAboutを選択した時の呼び出しはできるのだが、OpenDocumentsの処理がどうも動かない。ファイルをドラッグ&ドロップしてきても規定のメソッドが呼び出されないのだ。ファイルタイプの時の処理を思い出して、英語だけの短いファイル名で試してみたけど同様である。Release Noteには、AWTの初期化をしないとイベント処理ができないけども、パッケージにしたJavaアプリケーションは自動的にAWTの初期化が行われていると書かれている。Release Noteにはつまりは稼動するということが書かれていると考えてもいいので、筆者の段階でなにか問題がある可能性もあるが、Mac OSの上では、きちんとOpenDocumentsの処理はできていたプログラムである。これについては、原因が分かれば改めて追加で記事を作成する。
Mac OS Xではファイルメニューに「終了」はつけない。そして、システム側がアプリケーションメニューに終了の項目を自動的につける。このメニューを選択すると、QuitApplicationイベントがアプリケーションに送られるので、イベント対応さえしておけば、終了メニューには対応できる。ただし、再起動やシャットダウン時には、純粋Javaのアプリケーションは自動的には終了しないという制限がRelease Notesに書かれてある。どうしても、手作業で終了させる必要があるようだ(もちろん、AppleScriptで…という解決方法もある)。
なお、URL文字列を指定してそのURLをたとえばWebブラウザで開くといったopenURLというメソッドも用意されているのだが、Mac OS X 10.0には組み込まれなかったようだ。このメソッドは将来的には組み込まれる予定となっている。

以上のように、MRJの機能が完全ではない部分が見られるだけに、Javaのアプリケーションをすぐに使う必要がある場合には注意が必要だと言えるだろう。また、修正の動向などにも注意を払いたい。
関連リンク