今回は Advanced W-ZERO3 [es](以下、アドエス)上で Java ファイルをコンパイルする環境を構築します。
PC上で動作する Java コンパイラといえば javac ですが、Windwos Mobile 上で動作する javac はありません。しかし、Java SE 実行環境上で動作する「ecj」という Java コンパイラがあります。
ecj とは Eclipse プロジェクトで開発されている JDT Core Batch Compiler のことで、Pure Java で作成されているため Java SE 実行環境さえあれば Windows Mobile 上でも動作します。
早速、ecj を使用して Java SE コンパイル環境を構築します。
- まずは Java ファイルを作成するためにテキストエディタをインストールします。
「○号テキストエディタ」や「PocketHpte」がお勧めです。
- 次に Eclipse Project Downloads のページから Latest Releases のページを開き、ecj.jar をダウンロードしてアドエスの*本体メモリに*コピーします(理由は後述)。
- 最後に以下のようなバッチファイルを用意しておくと簡単に ecj を実行できます。
@ECHO OFF
SET JAVA_HOME=\Program Files\Mysaifu JVM
SET JAVA_BIN=%JAVA_HOME%\jre\bin\jvm_stdio.exe
SET JAVA_OPTION=-Xhidevmwindow -da -Xmx20M -Xss1M -Xoss1M
SET ECJ_CLASSPATH=\Java\ecj.jar
SET ECJ_MAIN=org.eclipse.jdt.internal.compiler.batch.Main
SET BOOT_CLASSPATH=%JAVA_HOME%\jre\lib\rt.jar
"%JAVA_BIN%" %JAVA_OPTION% -classpath "%ECJ_CLASSPATH%" %ECJ_MAIN% -bootclasspath "%BOOT_CLASSPATH%" -1.5 %1 %2 %3 %4 %5 %6 %7 %8 %9
@ECHO ON
ではテキストエディタを起動して以下の HelloEcj.java を作成します。
public class HelloEcj {
public static void main(String[] args) {
System.out.println("こんにちは、ecj!");
}
}
DOS窓Openを起動して作成した HelloEcj.java を ecj でコンパイルしてみます。
コンパイルが完了するまで数分かかるのでじっと待ちましょう。
注意点として、コンパイル中は CPU リソースを占有してしまうため、microSDカードを認識しなくなってしまうことがあります(ecj.jar ファイルを本体メモリに置くのはこの為です)。
Pocket の手等で内蔵デバイスの優先度を上げると緩和できるようです。
生成された HelloEcj クラスを実行してみます。
単純なクラスはコンパイルできましたが JDK 5 の新機能はどうでしょうか?
まずは拡張 for 文を試してみます。
以下の HelloEnhancedFor.java
を作成してコンパイルしてみます。
public class HelloEnhancedFor {
public static void main(String[] args) {
for (String arg : args) {
System.out.println(arg);
}
}
}
コンパイル、実行共に問題なさそうです。
次は Enum を試してみます。
以下の HelloEnum.java を作成してコンパイルしてみます。
public class HelloEnum {
private enum W_ZERO3 { WS003SH, WS004SH, WS007SH, WS011SH }
public static void main(String[] args) {
System.out.println(W_ZERO3.WS003SH);
System.out.println(W_ZERO3.WS004SH);
System.out.println(W_ZERO3.WS007SH);
System.out.println(W_ZERO3.WS011SH);
}
}
残念ながらコンパイルエラーになってしまいました。Enum は使えないようです。
次は Boxing/Unboxing を試してみます。
以下の HelloBoxing.java
を作成してコンパイルしてみます。
public class HelloBoxing {
public static void main(String[] args) {
int one = new Integer(1);
System.out.println("one = " + one);
Integer eleven = one + 10;
System.out.println("eleven = " + eleven);
}
}
コンパイル、実行共に問題なさそうです。
次は Static Import を試してみます。
以下の HelloStaticImport.java を作成してコンパイルしてみます。
import static java.lang.Math.random;
public class HelloStaticImport {
public static void main(String[] args) {
System.out.println("random = " + random());
}
}
コンパイル、実行共に問題なさそうです。
次は可変長引数を試してみます。
以下の HelloVariableArity.java
を作成してコンパイルしてみます。
public class HelloVariableArity {
public static void main(String[] args) {
String[] models
= new String[] {
"WS003SH", "WS004SH", "WS007SH", "WS011SH",
};
printWZERO3Models(models);
}
private static void printWZERO3Models(String... models) {
System.out.println("W-ZERO3 models...");
for (String model : models) {
System.out.println(model);
}
}
}
コンパイル、実行共に問題なさそうです。
最後に Generics を試してみます。
以下の HelloGenerics.java
を作成してコンパイルしてみます。
import java.util.List;
import java.util.ArrayList;
public class HelloGenerics {
public static void main(String[] args) {
List<String> models = new ArrayList<String>();
models.add("WS003SH");
models.add("WS004SH");
models.add("WS007SH");
models.add("WS011SH");
System.out.println("W-ZERO3 models by Generics ...");
for (String model : models) {
System.out.println(model);
}
}
}
残念ながらコンパイルエラーとなってしまいました。Generics も使用できないようです。
結果から考察すると、コンパイラの拡張に関するものは OK で、ライブラリの拡張に関するものは NG のようです。
理由は単純で Mysaifu JVM ver 0.3.4 は GNU Classpath 0.92 がベースになっているため、ライブラリに Enum クラスや Generics 対応のクラスが含まれていないのです。
※Enum クラスは含まれています。Generics に対応していないだけでした... orz
では、Mysaifu JVM ver 0.3.4 では Enum や Generics は使えないのか?というと使えます。
次回は、ecj を使って Enum や Generics を使用した Java ファイルをコンパイルする環境を構築します。
最近のコメント