Java コンパイラ「Jikes」を Windows Mobile に移植する
今回はネイティブな Java コンパイラである Jikes を Windows Mobile に移植して、Advanced W-ZERO3 [es](以下、アドエス)以外の W-ZERO3 でも Java ファイルをコンパイル出来る環境を構築します。
Jikes の移植には Windows Mobile 用クロスコンパイラ「CeGCC」を使用しました。
展開された「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 でコンパイルしてみます。
コンパイルは数秒で完了します。ecj とは雲泥の差です。
これで ecj とはオサラバです。
…といきたいところですが、Jikes は JDK 5 の新機能にほとんど対応していません。
対応しているのは拡張 for 文のみで、Enum、 Boxing/Unboxing、Static Import、可変長引数、Generics は使えません... orz
どこかに ecj のコードを Jikes に移植してくれるツワモノはいないですかね…。
| 固定リンク
「CeGCC」カテゴリの記事
- CeGCC の dup 関数は Socket ハンドルの複製には対応してなさげ…(2008.06.24)
- Java コンパイラ「Jikes」を Windows Mobile に移植する(2008.01.27)
- CeGCC の dup 関数の実装はどこ?(2008.06.23)
- Socket 対応版 ruby-mswince キテター!(2008.06.21)
「Java」カテゴリの記事
- SQLite3 JNI Library for Mac OS X (intel) バージョン 1.1.4 リリース!(2009.03.13)
- SQLite3 JNI Library for Macintosh (i386) バージョン 1.1.2 リリース!(2008.09.18)
- SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.1.4 リリース!(2009.03.12)
- SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.1.3 リリース!(2008.10.13)
- SQLite ver 3.6.3 for Windows Mobile(2008.09.27)
「W-ZERO3」カテゴリの記事
- SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.1.4 リリース!(2009.03.12)
- 24時間ワンセグ野郎 on Windows Mobile - 其ノ参(2009.02.18)
- 24時間ワンセグ野郎 on Windows Mobile - 其ノ弐(2008.12.17)
- 24時間ワンセグ野郎 on Windows Mobile(2008.12.16)
- SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.1.3 リリース!(2008.10.13)
「Windows Mobile」カテゴリの記事
- SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.1.4 リリース!(2009.03.12)
- 24時間ワンセグ野郎 on Windows Mobile - 其ノ参(2009.02.18)
- 24時間ワンセグ野郎 on Windows Mobile - 其ノ弐(2008.12.17)
- 24時間ワンセグ野郎 on Windows Mobile(2008.12.16)
- SQLite3 JDBC Driver for Mysaifu JVM バージョン 1.1.3 リリース!(2008.10.13)


コメント
Java初心者で、通勤中に勉強するためにこちらのページを参考にさせていただきました。おかげさまでJavaのコンパイルから実行まで、できました。手持ちのW-ZERO3で、ここまでできるなんて感動です。
1つだけもし可能なら教えていただきたいのですが、できた複数のclassファイルをjarファイルにまとめる方法はあるのでしょうか?例えばjava形式のjarコマンドとか・・・もしご存じでしたら、よろしくお願いします。
投稿: weed | 2009年1月29日 (木) 15時21分
# つまらないブログですがお役に立ててなによりです
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ファイルは作成されるもののファイル名がフルパスになっているため正しく実行できませんでした・・・うーむ
投稿: 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分