Fork me on GitHub

Conduit Cygwinで作成したdllを呼び出す

  • Jun 02, 2006

categoryプラグインは存在しません。

ちょっと一般的な JNI の話です。

Java から呼び出す DLL は Cygwin の gcc で作成することが可能。ここで紹介した環境は以下の通り。

  • Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_01-b01)
  • gcc version 3.2 20020927 (prerelease)
  • GNU dllwrap 2.13.90 20021118

作成手順は以下の通り。

1. JNI ヘッダファイルを修正

J2SDK のインストール先の include\win32\jni_md.h を開き、jlong の定義を

#ifdef __GNUC__
typedef long long jlong;
#else
typedef __int64 jlong;
#endif

と修正。

2. JNI 呼び出し用の各ファイルの用意

private static synchronized native int nativeInstallFile(byte[] user, byte[] filename);

というような native メソッドを持ったクラスを用意する。また、このクラスの static initializer あたりに、

static \{
  System.loadLibrary("clipsyncjni");
\}

というような、DLLを読み込むコードを入れておく。クラスをコンパイルしたら、

javah クラス名

としてヘッダファイルを生成する。このヘッダファイルに沿って、C の関数を用意する。この際の注意点は、

  • DLL に文字列等を渡す場合は、Java 側でコード変換を行って byte で渡したほうが無難。
  • DLL からさらに DLL を呼び出す場合は、LoadLibrary, GetProcAddress, FreeLibrary を使う。

というところ。

3. Cのソースのコンパイル

Cのソースは、

gcc -c -Ic:/j2sdk1.4.1/include -Ic:/j2sdk1.4.1/include/win32 -O2 -mno-cygwin InstAideBridgeJNI.c

などとしてコンパイルする。-I の指定先は J2SDK のインストール先に応じて変更する。

-mno-cygwin を指定していないと、DLL の利用時に cygwin1.dll が必要になる。

4. DLL の作成

DLLは、

dllwrap -mno-cygwin --add-stdcall-alias -mwindows --target=i386-mingw32 -o clipsyncjni.dll -s InstAideBridgeJNI.o

などとして作成する。特に --target=.. がないと、DLL の読み込み時にエラーになる。

commentプラグインは存在しません。

目次