64ビット版のEclipseをインストールしてふと疑問が。
EclipseってSWTだから、PureJavaじゃなくて、JNIでDLL呼び出してるよなあ。どうやって作るんだろうか。
早速試してみます。なかなか難しい。
試行錯誤した結果、以下の手順で一応できることが分かりました(実用性がほぼ無くなるほどの制約がつきます。後述)。
以下、jdkのバージョンは1.6.0_13、VCのバージョンは、9.0 (2008)です。もちろん、両方とも64ビット版です。
(1) TestJNI.javaを作成。
(2) 「javac TestJNI.java」
これにより、TestJNI.classが作成される。
(3) 「javah -jni TestJNI」
これにより、TestJNI.hが作成される。
(4) TestJNI.cを作成。
(5) 「Visual Studio 2008 x64 Win64コマンドプロンプト」で、「cl /I"c:¥Program Files¥Java¥jdk1.6.0_13¥include" /I"c:¥Program Files¥Java¥jdk1.6.0_13¥include¥win32" /MT /LD TestJNI.c」
これにより、TestJNI.dllが作成される。
ここで重要なのは、/MTオプション。(これにたどり着くのに2時間かかりました。)
(6) テスト。「java TestJNI」
上で「実用性がほぼ無くなるほどの制約」と言っているのは、VC 2008の場合に必ず動的リンクなってしまうDLLが呼び出せないこと(たとえば、printf()を利用すると、msvcr90.dllへのリンクが作られます)。
java.exeからこのDLLをロードしない限り、それを利用するDLLも「java.lang.UnsatisfiedLinkError」ではねられてしまうのですが、その方法が分かりません。
中途半端な結果ですが、とりあえず今日はここまで。
--- TestJNI.java ここから ---
public class TestJNI {
public native void hello();
static { System.loadLibrary("TestJNI"); }
public static void main(String[] args) {
new TestJNI().hello();
}
}
--- TestJNI.java ここまで ---
--- TestJNI.c ここから ---
#include <jni.h>
#include "testJNI.h"
/*#include <stdio.h> */
JNIEXPORT void JNICALL Java_TestJNI_hello
(JNIEnv *env, jobject obj)
{
/*printf("hello¥n");*/
return;
}
--- TestJNI.c ここまで ---