2008年7月30日水曜日

Javaからネイティブコードを生成する方法

このエントリーをはてなブックマークに追加
Javaでネイティブな実行ファイル(コード)を作成する方法をご紹介します.

構築環境はUbuntu 8.0.4です

準備:
GCJ (GNU Compiler for Java)をインストール
% sudo apt-get install gcj


ちなみにapt-getを使う際,プロキシを介すネットワーク環境の場合
以下のように設定ファイルを作る必要があります.
% sudo vim /etc/apt/apt.conf

Acquire {
http::proxy "http://[username]:[password]@[proxy_addr]:[port]/"
}




gcjのインストール後,[% gcj -v]等で正しくインストールされ,パスも通っているか確かめます.


プログラム作成:
以下のようなサンプルプログラムを作成します.
//Hello.java
public class Hello{
public static void main(String[] args){
System.out.println("hello World");
}
}

コンパイル:
方法1:オブジェクトファイルを作らずコンパイルする方法
% gcj --main=Hello -o Hello.exe Hello.java

方法2:オブジェクトファイルを作成してコンパイルする方法
% gcj -c -o Hello.o Hello.java
% gcj --main=Hello -o Hello Hello.o

以上です.Swingやawt等のGUIを作成しようするプログラムはうまく動作しないことがあるみたいです.

2008年7月11日金曜日

JavaからWin32APIをたたく方法

このエントリーをはてなブックマークに追加
JavaからWin32APIを呼ぶ方法を調べたのでメモしときます
(Cとかで書け、というツッコミは御勘弁)

JavaからC系の言語を使用するための方法として
JNI(Java Native Interface)が存在します。

Win32APIを使用するCのプログラムコードを書き、
それをJavaからこのJNIを利用することで、間接的にJavaからWin32APIを使用することが可能となりますが、JNIは使用するまでに多くのステップ数を踏む必要があります。



そこで、Win32APIをJavaから利用するためのライブラリを使用します。

そのライブラリはEclipseのPluginsディレクトリ内に存在する「org.eclipse.swt.win32.win32.x86_[バージョン].jar」です。

このjarファイルにクラスパスを通し、importすることで、ライブラリを利用することができます。
(Eclipseでjarファイルにクラスパスを通す場合は[プロジェクト名を右クリック]-[Build Pass]-[Add External Archives]です)

/////////////////////
サンプルプログラム
/////////////////////
//Main.java

import org.eclipse.swt.internal.win32.OS;

public class Main {
static void process() {
int hDC = OS.GetDC(0);
try {
for (int i = 0; i < 500; i += 1) {
OS.MoveToEx(hDC, 0, i, 0);
OS.LineTo(hDC, 500, 500 - i);
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} finally {
OS.ReleaseDC(0, hDC);
}
}

public static void main(String[] args) {
process();
}
}

参考サイト:
http://homepage2.nifty.com/igat/igapyon/diary/2005/ig051228.html
http://d.hatena.ne.jp/unageanu/20070518