トップ 差分 一覧 ソース 置換 検索 ヘルプ PDF RSS ログイン

GCJの使い方

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(180)

サンプル

 HelloWorld

1
2
3
4
5
6
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
2
3
4
5
6
7
8
9
10
11
12
13
14
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 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
2
3
4
5
#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 だけはあるみたいだが未完成。

[カテゴリ: プログラミング言語 > Java]



  • Hatenaブックマークに追加
  • livedoorクリップに追加
  • del.icio.usに追加
  • FC2ブックマークに追加

最終更新時間:2015年08月30日 00時47分51秒