GCJとは
GNU Compiler for Java。GCCの一部で、Javaのコードをバイトコードや機械語にコンパイルする。
classやjarファイルを直接機械語にすることもできる。
準備
GNUpack、CygwinかMingGWを使う。
ここでは、GCC/GCJ for MinGWをSWT使いやすく
カスタマイズされたものを使う。
ダウンロード
https://www.thisiscool.com/gcc_mingw.htm
からダウンロードして、適当な場所に解凍してパスを通す。
gcc43ecj-20061207.tar.bz2(516)
サンプル
HelloWorld
1 |
public class HelloWorld { public static void main(String[] args) { System.out.println("HelloWorld"); System.out.println("日本語"); } } |
コンパイル
gcj -s --main=HelloWorld HelloWorld.java
-s オプションは実行ファイルのサイズを極力小さくする
SWT
1 |
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
1 |
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
1 |
/* DO NOT EDIT THIS FILE - it is machine generated */ #ifndef __HelloWorldJNI__ #define __HelloWorldJNI__ #include <jni.h> #ifdef __cplusplus extern "C" { #endif JNIEXPORT void JNICALL Java_HelloWorldJNI_sayHelloWorld (JNIEnv *env, jobject); #ifdef __cplusplus } #endif #endif /* __HelloWorldJNI__ */ |
HelloWorldJNI.c
1 |
#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プラグインは存在しません。
/*
リソースは、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 だけはあるみたいだが未完成。
[通知用URL]
Tweet
最終更新時間:2015年08月30日 00時47分51秒