タイトルJava Watch on the X》2 - 結果的に実用的じゃないJDirectのサンプル(1)カテゴリーJava, Java Watch on the X
作成日2001/11/22 19:11:44作成者新居雅行
【MDOnline読者様限定コンテンツ】

先に言い訳をしておこう。「いろいろやって実用的にならなかった」という悲しい結末を記事にしなければならないが、それはそれでなんとかしたい。要は、変なところにはまってしまって身動きがとれなくなったのだ。本当は、JavaでAppleScriptのプログラムを実行するということにしたかったのだが、これは次のテーマとして、今回は、いきなりJDirectである。

以前にも公開したことがあるが、Pure JavaからAppleScriptのプログラムを実行するというクラスをMac OSで稼働するようなものを作ったことがある。御存じの通り、Pure JavaではMac OSの機能の全てが使えない。そこで、あれこれ悩むことになる。「うまく動けば」という前ふりはあるけども、以外にうまくいってかつデバッグ等がしやすいのが、AppleScriptのプログラムをテキストで用意し、それをOpen Scripting Archtectureに用意されているAPIに渡して処理をすることである。結果も得られるので、たとえば、Javaのプログラムから、ファイルのコメントを設定したりということができたわけである。もちろん、AppleScriptが使えれば…という前提はあるものの、Javaの機能制限を突破する1つの手法であることは違いない。もっとも、クロスプラットフォームという点は一気にくずれるのは仕方ない。
同じような目的で、やっぱりMac OS XでもAppleScriptのプログラムをテキストで与えればそれが動くというものがあれば便利ではないかと考えた。そのためには、Mac OSと同様、OSAにあるAPIをたたくという方法がある。APIなのでC言語のインタフェースとなっているわけだが、MRJにはJDirectという仕掛けがあって、C言語のライブラリ(あるいはフレームワーク)の呼び出しが行える。Javaでのネイティブ呼び出しはJNIが標準としてあるが、JDirectは機能がシンプルな分、使いやすいとかパフォーマンスがいいということがある。もちろん、JDirectはMac OSあるいはMac OS Xでしか使えないが、その先のシステムコールに依存するわけで、そこまで標準にこだわることもないだろう。
ただ、JDirectについては、Mac OSとMac OS Xではバージョンが違っており、ポイントとなる部分にも違いがある。Technical Noteには、両互換のクラスを定義する方法が掲載されているが、いずれにしても、JDirectを使ったクラスは、Mac OSで作っていたものはMac OS Xでは修正しないといけないので、Mac OS Xにフォーカスしたクラスを作ることにする。

さて、結果としては、JDirectを使ってOSAのAPIを呼び出すプログラムは、どうも動かないのである。アプリケーションとして起動した場合、スクリプトの実行APIはエラーを戻す。スクリプトに記述されたプログラムのターゲットアプリケーションから辞書情報が得られないというエラーになり、一切実行されない。一方、コマンドラインから起動するアプリケーションでGUIのないものを作った場合、スクリプトの実行はされないわけではないが、AppleEventのタイムアウトになって、エラーになる。だから値を取り出せないし、時間もかかるので、ちょっと実用的ではない。おそらく、AppleEventの双方向のやりとりが何らかの形でうまくいかないのであると思われるが、これ以上の突っ込みはできなかった。したがって、「実用的じゃないJDirectのサンプル」程度のものしかできなかったのである。(ただ、このプログラムは、Mac OS X 10.1ではそれなりに動いていた。確証はないのだが、システムの修正に依存している可能性もある。)
一方、以前にも紹介したことがあるが、Mac OS Xには、osascriptというコマンドがあり、TerminalからコマンドをたたいてAppleScriptを実行させることが可能となっている。JavaからAppleScriptのプログラムを実行したい場合には、むしろ、このコマンドを呼び出す方がおそらくうまく動くだろう。日本語のファイル名はどうするのかなども興味あるところだが、実用的なAppleScript実行クラスはそちらで作ることにして、今回はいきなり深いテーマだがJDirectということになったのである。

JDirectについてのドキュメントは完全には揃っていないが、Mac OS時代のものと、いくつかの文書を見れば、いちおう情報は揃うはずだ。JDirectについて最初から勉強するには、MRJ 2.1向けのPDFがあるのでそれを調べるのが第一歩だ。ただしそちらは、Mac OS 9までのJDirect 2に関する文書となっている。そして、Technoteの2002番に、Mac OS Xに搭載されているJDirect 3についての解説が掲載されている。

◇MRJ 2.1のJDirect
http://devworld.apple.com/techpubs/java/MacOSandJava/JDirect/JDirect.html

◇TN2002: Compatibility between JDirect 2 and JDirect 3
http://developer.apple.com/technotes/tn/tn2002.html

JDirect2と3では、ライブラリのリンクを行う部分に違いがあるだけで、ネイティブメソッドの定義などは基本的に同じとなっている。上記のTechnoteに違いがきちんと示されている。
今回のプログラムは、以下のアドレスからダウンロードして参照していただきたい。プログラムを全部掲載することは行わない。プログラムは、Project Builderのプロジェクトとなっているが、プログラムを確認するだけなら、フォルダの中の該当するファイルを参照するのでかまわないだろう。

◇サンプルプログラム
 http://mdonline.jp/figs/01/0039/MDOnline_02_DoAppleScript.sit

(この項続く)
関連リンク