Javaのコードをウインドウズネイティブアプリケーションとしてコンパイルする(MinGW+GCJ)
MinGWとGCJを使うことで、GUIなしのJavaコードについては、
ウインドウズネイティブアプリケーションとしてコンパイルできる。
GUIの場合でも、GUIがSWTで記述されていれば、
ウインドウズネイティブアプリケーションとしてコンパイルできる。
とはいえ、日本語処理の問題とか、すんなり乗り越えられないことがあるので注意が必要。
MinGW,MSYSのインストール
以下の2つのexeをダウンロードしてきてダブルクリックでインストール自体は完了する。
- MinGW home
MinGW-5.0.2.exe install
- MSYS-1.0.11-2004.04.30-1.exe install
Post install process にて 1.MinGWのインストール場所を尋ねられる
Please answer the following in the form of c:/foo/bar.
Where is your MinGW installation? _
ここで、{strong:c:/MinGW} とこたえます。
(デフォルトでMinGW-5.0.2.exe をインストールした場合)
この方法で良いと思ったのだが、実際には、Post install process は、 指定したパスでは問題があると報告してきた。
その後、/etc/fstab を適切に設定せよとあったので、 MSYS上で、/etc/fstab.sample を元に /etc/fstab を設定。 (実際には、ActiveState/perlの行をdisableにしただけ)
インストールがうまくいったかの確認
$ gcj --version
これでメッセージがかえってこればOK。
Hello.java を試す
お約束の簡単なプログラムのテストをする
Hello.java
public class Hello {
public static void main(String[] s){
System.out.println("Hello MinGW!");
}
}
MSYSからコンパイル。
gcj -Wall -o Hello --main=Hello Hello.java
しかしここで、ld.exe が -liconv が無効などといったエラーを出す。 どうやら、libiconv というライブラリが別途必要らしい。
libiconvのインストール
sourceforgeのMinGWで{strong:libiconv-1.9.2-mingwPORT.tar.bz2}を入手。
これをMSYS上にて次のようにインストール。
(/usr/src 以下で作業しないとうまくいかないようです。)
$ cd /usr/src/
$ cp /path/to/libiconv-1.9.2-mingwPORT.tar.bz2 .
$ tar jxf libiconv-1.9.2-mingwPORT.tar.bz2
$ cd libiconv-1.9.2/mingwPORT
$ sh ./mingwPORT.sh
あとは、質問に適当にこたえると、ダウンロードが開始されメイクがはじまる。
再びMSYSからコンパイル
gcj -Wall -o Hello --main=Hello Hello.java
今度はうまくいきました。
一般的なJavaアプリケーションのコンパイル方法(GUIなし)
ある程度の規模のソフトウェアであれば、 ソースファイルが複数あり、 大抵はパッケージになって複数のディレクトリから 構成されています。
こういった場合のコンパイル方法
普通のJavaの流儀で、foo.jar を作成
まずは、ANTなどを使って(使わなくてもよいですが)通常のJavaの流儀で、 必要なクラスを全部集めた jar を作成しておきます。
ただし、この方法はGUIがないソフトウェアの場合。 GUI付きのソフトウェアでは、まずSwingを使っていなくて、SWTで出来ていることが条件になります。 その上で、いろいろ対処すれば .exe を生成可能。
Swingもソースがあり、手直しするならば、SwingWTを使うことで、 コンパイル可能になる可能性があります。
日本語を扱う必要がある場合
状況によると思いますが、日本語ファイルを読み書きするアプリケーションの場合、 InputUTF8.o,OutputUTF8, InputSJIS.o,OutputSJIS などを含める必要があります。
その場合、Input_UTF8.o などは、libgcj.a に含まれているので、それを ar コマンド取り出します。
$ ar x /mingw/lib/libgcj.a Input_SJIS.o
$ ar x /mingw/lib/libgcj.a Output_SJIS.o
$ ar x /mingw/lib/libgcj.a Input_UTF8.o
$ ar x /mingw/lib/libgcj.a Output_UTF8.o
取り出したオブジェクトファイルをexeファイル生成時に含めるようにGCJに指示します。
$ gcj --main=Main -o test.exe foo.o Input_UTF8.o Output_UTF8.o Input_SJIS.o Outpu_SJIS.o
一般的なJavaアプリケーションのコンパイル方法(GUIあり、SWTを使用)
まず、通常のPureJavaで起動できるように foo.jar ファイルを作成しておきます。
つまり、SWT関連の必要なクラスも全部 foo.jar に含めておくということです。
その上で、以下のように -fjni オプションを付けて、GCJを実行します。
$ gcj -fjni -c foo.jar # foo.o が生成されます
$ gcj -mwindows --main=Main -o test.exe foo.o
※ -mwindowsオプションにより起動時にコンソール画面を非表示にできるようです。
もちろん、たびたびSWTのアプリケーションをコンパイルするならば、 SWT関連クラスだけを集めた swt.jar を作成しておき、それをGCJで処理して、 swt.o を独立に作成しておけば作業時間を短縮できます。