タイトルJavaアプリケーションからAppleScriptのプログラムを実行する-ソースプログラム(1)カテゴリーJava, AppleScript
作成日2000/9/21 2:50:41作成者新居雅行
◇Application1.java

public class Application1
{
static public void main(String[] args)
{
String script, result;

script = "tell application \"Finder\"\r";
script += "open system folder\r";
script += "end tell\r";
result = AppleScriptUtils.doScript(script);

System.out.println("Result: " + result);
}
}

◇AppleScriptUtils.java

import java.io.*;
import java.util.*;

//共有ライブラリを利用できるようにする
interface ASLibrary extends com.apple.jdirect.SharedLibrary {
public static Object libraryInstance = com.apple.mrj.jdirect.JDirectLinker.loadLibrary("AppleScriptLib");
}
interface IFLibrary extends com.apple.jdirect.SharedLibrary {
public static Object libraryInstance = com.apple.mrj.jdirect.JDirectLinker.loadLibrary("InterfaceLib");
}

public class AppleScriptUtils implements ASLibrary,IFLibrary {

//ライブラリにある関数をnative宣言する
private native static short OSADoScript(int scriptingComponent, int[] sourceData,int contextID,
int desiredType, int modeFlags, int[] scriptID);
private native static short OSAScriptError(int scriptingComponent, int selector, int desiredType,
int[] resultingErrorDescription);
private native static short AECreateDesc(int typeCode, byte[] dataPtr, int dataSize, int[] desc);
private native static short AEDisposeDesc(int[] desc);
private native static int OpenDefaultComponent(int componentType, int componentSubType);
private native static short CloseComponent(int componentInstance);
private native static int GetHandleSize(int handle);

//スクリプトを実行するメソッド
public static synchronized String doScript(String script) {
int comp = OpenDefaultComponent(0x6f736120, 0x73637074); //’osa ’, ’scpt’
//スクリプト処理を行うコンポーネントの取得
int[] sourceData = {0,0}; //これらはAEDesc構造体なのでCのlongが2つ分、その分のメモリを確保しないとフリーズする
int[] resultData = {0,0};
byte[] scriptBytes = {0};
String rValue = "";
try {
scriptBytes = script.getBytes(); //スクリプトの文字列のbyte列を得る
short err = AECreateDesc(0x54455854, scriptBytes, scriptBytes.length, sourceData); //’TEXT’
//スクリプトのテキストをディスクリプタ化する
if (err == 0) {
err = OSADoScript(comp, sourceData, 0, 0x54455854, 0x00000010, resultData);
//スクリプトの実行を行う
if (err !=0)
OSAScriptError(comp, 0x65727273, 0x54455854, resultData); //’errs’, ’TEXT’
//実行エラーがある場合、エラーを取得する
AEDisposeDesc(sourceData); //スクリプトのディスクリプタはいらないので破棄
com.apple.mrj.jdirect.GenericHandle dHandle = new com.apple.mrj.jdirect.GenericHandle(resultData[1]);
//スクリプトの結果データをハンドルとして取得する
byte[] strs = dHandle.getBytesAt(0, GetHandleSize(resultData[1]));
rValue = new String(strs); //結果データから文字列を取り出す
AEDisposeDesc(resultData); //結果データのディスクリプタは不要になる
}
CloseComponent(comp); //コンポーネントを閉じる
System.out.println("%%DoScript:\r"+script); //実行したプログラムをコンソールに表示
}
catch(Exception e)
{ System.out.println(e.getMessage()); } //例外処理(かなり手抜きだけど)
return rValue;
}
//Javaのファイルへのフルパスから、AppleScriptで使えるフルパスの文字列に変換する(参考)
public static String getMacOSPath(File f) {
//中身は別掲の記事を参照
}
}
関連リンク