2013年2月28日木曜日

64ビットJNI

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 ここまで ---

0 件のコメント:

コメントを投稿