!!!GCJとは GNU Compiler for Java。GCCの一部で、Javaのコードをバイトコードや機械語にコンパイルする。 classやjarファイルを直接機械語にすることもできる。 !!!準備 GNUpack、CygwinかMingGWを使う。 ここでは、GCC/GCJ for MinGWをSWT使いやすく カスタマイズされたものを使う。 !!ダウンロード https://www.thisiscool.com/gcc_mingw.htm からダウンロードして、適当な場所に解凍してパスを通す。 {{ref gcc43ecj-20061207.tar.bz2}} !!!サンプル !!HelloWorld {{code Java, public class HelloWorld { public static void main(String[] args) { System.out.println("HelloWorld"); System.out.println("日本語"); } } }} コンパイル gcj -s --main=HelloWorld HelloWorld.java -s オプションは実行ファイルのサイズを極力小さくする !!SWT {{code Java, import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class HelloSWT { public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); shell.setText("Hello SWT"); shell.setSize(600, 400); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } } }} コンパイル gcj -s --main=HelloSWT HelloSWT.java --classpath=インストール先\thisiscool-gcc\swt\win32\3218\swt.jar -Lインストール先\thisiscool-gcc\swt\win32\3218 -lswt !!JNI {{code Java, public class HelloWorldJNI { static { // ライブラリをロードします System.loadLibrary("HelloWorldJNI"); } // ネイティブメソッドを宣言します public native void sayHelloWorld(); public static void main(String[] args) { HelloWorldJNI hello = new HelloWorldJNI(); hello.sayHelloWorld(); } } }} ヘッダファイル作成 gcj -C HelloWorldJNI.java gcjh -jni HelloWorldJNI HelloWorldJNI.h {{code Java, /* DO NOT EDIT THIS FILE - it is machine generated */ #ifndef __HelloWorldJNI__ #define __HelloWorldJNI__ #include #ifdef __cplusplus extern "C" { #endif JNIEXPORT void JNICALL Java_HelloWorldJNI_sayHelloWorld (JNIEnv *env, jobject); #ifdef __cplusplus } #endif #endif /* __HelloWorldJNI__ */ }} HelloWorldJNI.c {{code Java, #include "HelloWorldJNI.h" JNIEXPORT void JNICALL Java_HelloWorldJNI_sayHelloWorld ( JNIEnv *env, jobject obj ) { printf("Hello World\n"); printf("日本語\n"); } }} ダイナミックライブラリ作成 gcc -shared -o HelloWorldJNI.dll HelloWorldJNI.c コンパイル gcj --jni --main=HelloWorldJNI HelloWorldJNI.java 作成したDLLをexeと同じディレクトリかパスが通ったディレクトリに置く必要がある。 日本語は化けてしまう。 対策はググると出てくるので省略。 !!リソース {{cde Java, /* リソースは、gcjで--resourceでコンパイルするか jarファイルに入れることで、jarと同様にURL取得可能。 */ import java.io.*; public class test { public static void main(String[] args) { System.out.println(ClassLoader.getSystemResource("test.java")); try { System.out.println(ClassLoader.getSystemResource("test")); System.out.println(ClassLoader.getSystemResource("test.txt")); System.out.println(ClassLoader.getSystemResource("resources/test.txt")); System.out.println(ClassLoader.getSystemResource("resources\\test.txt")); File file = new File("test"); System.out.println(file.canRead()); } catch (Exception e){ e.printStackTrace(); } } } }} リソース準備 gcj -c -o resource.o --resource=test test.java コンパイル gcj --main=test test.java resource.o jarファイル内のclassファイル以外はリソースとして認識するので、リソースファイルを準備しなくても gcj -c test.jar gcj --main=test test.java test.o とすると、test.jarファイル内のファイルをリソースとして使える。URLは core:/....になる !!JDBC JDBCのドライバでGCJ対応のものはほとんどない。 H2 だけはあるみたいだが未完成。 {{category2 プログラミング言語,Java}}