◇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) { //中身は別掲の記事を参照 } }
|