« Advanced W-ZERO3 [es] で Java SE 開発 - 其ノ参 | トップページ | ruby-mswince を Socket に対応できないか? »

2008年1月27日 (日)

Java コンパイラ「Jikes」を Windows Mobile に移植する

今回はネイティブな Java コンパイラである Jikes を Windows Mobile に移植して、Advanced W-ZERO3 [es](以下、アドエス)以外の W-ZERO3 でも Java ファイルをコンパイル出来る環境を構築します。

Jikes の移植には Windows Mobile 用クロスコンパイラ「CeGCC」を使用しました。

jikes-1.22-wince.zip」をダウンロード

展開された「jikes.exe」、「cegcc.dll」、「cegccthrd.dll」を任意のフォルダにコピーしてください(microSD カード上でも OK)。

既に「cegcc.dll」と「cegccthrd.dll」が Windows フォルダなどに存在する場合はコピー不要です。

「jikes-1.22-mswince」フォルダ以下には Windows Mobile 用に修正したソース一式が入っていますので必要ない方は削除して下さい。

ソース一式はこちら。

移植した Jikes の注意点ですが、

  • 「-encoding」オプションに指定できるのは「MS932」と「UTF-8」の 2 種類のみ。
    これは文字コード変換に libiconv ではなく MultiByteToWideChar を使用しているため。
    こちらのページで公開されている iconv.lzh を使用させて頂きました。
    オプションを指定しない場合は「MS932」として処理されます。
  • 引数などで指定するパスには日本語などのマルチバイト文字は使用できない。
    CeGCC では opendir 関数や FindFirstFile 関数がマルチバイト文字が含まれるパスに対応していないため。
    (もし対応する方法があればコメントください)

それと、Jikes を移植する際に Windows Mobile 用の native2ascii と ascii2native も作成しました。

「native2ascii-mswince.lzh」をダウンロード

展開された「ascii2native.exe」、「native2ascii.exe」を任意のフォルダにコピーしてください。

こちらの注意点は、

  • Sun の native2ascii と異なりオプションの指定はできません。
    文字コードは「MS932」固定です(手抜き)。
  • 引数も指定できず、リダイレクトのみ。
    「native2ascii 入力ファイル > 出力ファイル」のようにして実行します。

では、早速 Jikes でコンパイルしてみます。以下ようなバッチファイルを用意しておくと簡単に Jikes を実行できます。

@ECHO OFF
SET JIKES_BIN=\microSDカード\Java\jikes.exe
SET BOOT_CLASSPATH=\Java\sun-jre1.6.0_04-rt.jar
SET JIKES_OPTION=-bootclasspath "%BOOT_CLASSPATH%" -source 1.5
"%JIKES_BIN%" %JIKES_OPTION% %1 %2 %3 %4 %5 %6 %7 %8 %9
@ECHO ON

テキストエディタを起動して以下の HelloJikes.java を作成します。

public class HelloJikes {
    public static void main(String[] args) throws Exception {
        System.out.println("こんにちは、Jikes!");
        String circledDigit
            = "①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳";
        for (char digit : circledDigit.toCharArray()) {
            System.out.print(digit);
        }
    }
}

DOS窓Openを起動して Jikes でコンパイルしてみます。

Scrn0015

コンパイルは数秒で完了します。ecj とは雲泥の差です。

これで ecj とはオサラバです。


…といきたいところですが、Jikes は JDK 5 の新機能にほとんど対応していません。

対応しているのは拡張 for 文のみで、EnumBoxing/UnboxingStatic Import可変長引数Generics は使えません... orz

どこかに ecj のコードを Jikes に移植してくれるツワモノはいないですかね…。 

|

« Advanced W-ZERO3 [es] で Java SE 開発 - 其ノ参 | トップページ | ruby-mswince を Socket に対応できないか? »

CeGCC」カテゴリの記事

Java」カテゴリの記事

W-ZERO3」カテゴリの記事

Windows Mobile」カテゴリの記事

コメント

Java初心者で、通勤中に勉強するためにこちらのページを参考にさせていただきました。おかげさまでJavaのコンパイルから実行まで、できました。手持ちのW-ZERO3で、ここまでできるなんて感動です。

1つだけもし可能なら教えていただきたいのですが、できた複数のclassファイルをjarファイルにまとめる方法はあるのでしょうか?例えばjava形式のjarコマンドとか・・・もしご存じでしたら、よろしくお願いします。

投稿: weed | 2009年1月29日 (木) 15時21分

# つまらないブログですがお役に立ててなによりですhappy01

W-ZERO3上でjarコマンドが使いたいということですが実現する方法がいくつか考えられます。

1.GNU Classpath Toolsをビルドする。
 GNU Classpathにはjarコマンドを実行できるクラスも存在しています。
 http://www.gnu.org/software/classpath/docs/cp-tools.html#SEC31

 Mysaifu JVMにはGNU Classpath Toolsは付属していませんのでPC上でビルドする必要がります。
 >javac -cp .;rt.jar gnu\classpath\tools\jar\Main.java
 # rt.jarはMysaifu JVMに付属しているものをPC上にコピーしてください。
 
 ビルドしたTools一式をW-ZERO3上にコピーすれば以下ようにして使用できるはずです。
 >jvm.exe gnu.classpath.tools.jar.Main cvf HelloWorld.jar *.class

2.自分で作る。
 JarファイルのフォーマットはZIPと同じなのでZipOutputStreamクラスを使用して自前で実装することができます。

1.の方法を手元で試してみましたがjarファイルは作成されるもののファイル名がフルパスになっているため正しく実行できませんでした・・・うーむcoldsweats01

投稿: calico | 2009年1月29日 (木) 22時31分

すぐにお返事いただき本当にありがとうございます。とても気になっていたので、さっそく試してみました。残念なことにコンパイルがうまくいきませんでした。エラーメッセージは以下のようなものでした。

C:\Users\ueda\Desktop\classpath-0.97\classpath-0.97\tools\gnu\classpath\tools\jar\Main.java:229: シンボルを見つけられません。
シンボル: クラス Option
場所 : gnu.classpath.tools.jar.Main の クラス
grp.add(new Option('C', Messages.getString("Main.ChangeDir"), //$NON-NLS-1$
^
C:\Users\ueda\Desktop\classpath-0.97\classpath-0.97\tools\gnu\classpath\tools\jar\Main.java:237: シンボルを見つけられません。
シンボル: クラス Option
場所 : gnu.classpath.tools.jar.Main の クラス
grp.add(new Option('@', Messages.getString("Main.Stdin"))
^
C:\Users\ueda\Desktop\classpath-0.97\classpath-0.97\tools\gnu\classpath\tools\jar\Main.java:268: シンボルを見つけられません。
シンボル: クラス Parser
場所 : gnu.classpath.tools.jar.Main の クラス
Parser p = initializeParser();
^ ^

どうも必要なクラスライブラリの参照に失敗しているようです(素人推測ですが)。頂いたアドバイスをよく見るとカレントディレクトリもクラスパスに含めているようですが、これはどこにすればよいのか、お時間ある時にでもアドバイスいただけると幸いです。

↓これです
-cp .;rt.jar

なお、コンパイルは以下のようにしました。

C:\Program Files\Java\jdk1.6.0_10\bin>javac -cp C:\Users\hoge\private\doc\rt.jar C:\Users\hoge\Desktop\classpath-0.97\classpath-0.97\tools\gnu\classpath\tools\jar\*.java

投稿: weed | 2009年1月30日 (金) 12時52分

クラスパスに「C:\Users\hoge\Desktop\classpath-0.97\classpath-0.97\tools」を追加してみてください。
それでコンパイルは通るはずです。

マニフェストファイルを指定しない場合は正しくjarファイルが作成されることまでは確認できたんですが、mオプションを追加するとなぜかマニフェストファイルが取り込まれない...orz

投稿: calico | 2009年1月31日 (土) 01時14分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/505952/17850487

この記事へのトラックバック一覧です: Java コンパイラ「Jikes」を Windows Mobile に移植する:

» 「Advanced/W-ZERO3[es]」についてのブログリンク集 [最新ブログをまとめて検索]
Advanced/W-ZERO3[es] に関するブログのYahoo、Google、Goo、Livedoor検索による最新の口コミ情報をお届けします!… [続きを読む]

受信: 2008年1月27日 (日) 13時51分

« Advanced W-ZERO3 [es] で Java SE 開発 - 其ノ参 | トップページ | ruby-mswince を Socket に対応できないか? »