ひよっこ。

I want to…

Air2.0(ベータ版)でネイティブプロセスでjarファイルを実行する方法(泥臭い編)

Posted by hikaruworld : 2009 12月 13

Air2.0(現時点ではβ1版)での新機能の一つとして、ネイティブプロセスを実行することができるようになっています。

詳細はこのあたりが参考になります。

  1. AIR 2.0 ではじめるコミュニケーションツール Comm On AIR 2.0

この新機能を用いてjarファイルを実行したかったのですが、
ちょっと面倒な実装になってしまったのでメモしておきます。

ちなみに環境はMacOSX(雪豹)です。
winだとjarファイルを直接渡しても実行してくれるのかなぁ(javaw -jar hoge.jar)。

結論としては、jarファイル単体実行が結局うまくいかずshのラッパーを用意しました。

  • bin/exec.jar
  • bin/wrapper.sh

という感じでアプリケーションに実行ファイルを含めておきます。

exec.jarはマニュフェストファイルが存在する実行可能jarファイルで固めてあります。
wrapper.shの中身はこんな感じです。

#!/bin/sh

# 単純にjava -jarで第一引数に実行対象のjarファイルを渡す。
# jarファイルにパスが通っている前提
$(java -jar $1)

java -jarコマンドを実行時に$1でwrapper.shに渡された
引数(これが実行対象のjarファイルになります)をそのまま指定しています。

Air2.0側では、以下のような実装を書きました。

var info:NativeProcessStartupInfo = new NativeProcessStartupInfo();
// 実行対象のファイル(ラッパー)を指定
var file:File = File.applicationDirectory.resolvePath("bin/wrapper.sh");
info.executable = file;

// wrapper.shに渡す引数を指定
var args:Vector.<String> = new Vector.<String>();
// 相対指定だとAirのランタイムからの指定になってしまうので、
// 実際にjava -jarコマンドに渡したいファイルの絶対パスを解決する。
var jarFile:File = File.applicationDirectory.resolvePath("bin/exec.jar");
args.push(jarFile.nativePath);
info.arguments = args;

// 実行
this.process = new NativeProcess();
process.start(info);

ソースコード上のコメントにもありますが、
ネイティブプロセスによって実行されたファイルのカレントディレクトリ(pwd)が、
AirのRuntimeになってしまうようで、アプリ内に存在するファイルの
絶対パスを解決して渡しているとう微妙な実装をしています。

以上。

めちゃめちゃ泥臭い実装なんですが、
よりより方法があれば誰か教えてください。

コメント / トラックバック1件 to “Air2.0(ベータ版)でネイティブプロセスでjarファイルを実行する方法(泥臭い編)”

  1. 匿名 said

    jar バンドラーでappにしたら、うまくできました。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

 
%d人のブロガーが「いいね」をつけました。