Index > Javaのコードをウインドウズネイティブアプリケーションとしてコンパイルする(MinGW+GCJ)
Tue, June 13, 2006

Javaのコードをウインドウズネイティブアプリケーションとしてコンパイルする(MinGW+GCJ)

MinGWとGCJを使うことで、GUIなしのJavaコードについては、 ウインドウズネイティブアプリケーションとしてコンパイルできる。
GUIの場合でも、GUIがSWTで記述されていれば、 ウインドウズネイティブアプリケーションとしてコンパイルできる。

とはいえ、日本語処理の問題とか、すんなり乗り越えられないことがあるので注意が必要。

MinGW,MSYSのインストール

以下の2つのexeをダウンロードしてきてダブルクリックでインストール自体は完了する。

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 を独立に作成しておけば作業時間を短縮できます。

 Twitter
follow me on Twitter
 Categories