JNI -とりあえずHello World-


※このページは800×600以下の解像度だと横スクロールで見にくいかもしれません。


□ 目次 □

はじめに

環境

Javaソース

ヘッダ作成

Cソース

DLLの作成

実行

Back

はじめに

JNIっていうのは、つまりJava Native Interfaceの略語であります。直訳すると「本来のインターフェイス?」って、よくわからなくなってしまうのですが、簡単に言えば、プラットフォーム上のライブラリをJavaから呼び出すための方法ってことになるのでしょうか?(という意味からすれば、Java Native Method Invocationとかの方がわかりやすいような気がする)

個人的には、せっかく美しいJavaの世界から、複雑怪奇なDLLなぞを呼ばなければならないのかと憤慨することもあるのですが、それはそれ、性能なり、既存資産なりって考えると、必ずしもJavaの世界だけで収まらない場合もあるだろうし... と必要悪として認知した上で、ちょっと見ていこうと思った次第。

まずは、おきまりのHello Worldからはじめましょう。

初回ということで、作成方法、実行方法を順を追って解説します。

ページ先頭へ戻る


環境

OSWindowsNT Workstation 4.0 (SP4)
JDK1.1.8
CコンパイラMicrosoft VisualC++ 6.0
今回はWindowsでの紹介です。
...ってことは、つまり、Cコンパイラは別途用意しなければならないことを意味します。
私は、泣く泣く(?)、Visual Studio6.0をインストールしました。

ページ先頭へ戻る


Javaソース

まずは、いきなりJavaのソースを書きます。とりあえず、HelloWorld.javaとでもしておいてください。


// HelloWorld.java
//
import java.io.*;
public class HelloWorld {
  public native void printMessage();
  void init() {
    System.loadLibrary("HelloWorld");
  }
  public static void main (String args[]) {
    HelloWorld hello = new HelloWorld();
    hello.init();
    hello.printMessage();
  }
}

  • DLL側に作る予定の関数にはnativeを付与する。
  • ライブラリはSystem.loadLibraryで明示的にロードする。(今回はわざわざinit()メソッドを作っているが、staticメソッドで行っても良いかも)
  • ライブラリ名には.DLLをつけない。

無事ファイルが作成できたら、

javac HelloWorld.java
でクラスを作っておきましょう。

ページ先頭へ戻る


ヘッダ作成

無事HelloWorld.classが作れたら、次は、ヘッダファイルの作成です。

javah -jni HelloWorld

を実行すると、ローカルパス上に、HelloWorld.hが生成されているはずです。


/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    printMessage
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_printMessage
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

ページ先頭へ戻る


Cソース

C側のソースは、先ほど生成してくれたヘッダファイルから、余計な(?)コメント、プリプロセッサ文を取り払って作成します。

今回は、ただ文字を表示するだけですから、こんな感じです。


#include "HelloWorld.h"

/*
 * Class:     HelloWorld
 * Method:    printMessage
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_printMessage
  (JNIEnv *env, jobject me)
{
  printf("Helo World!!!\n");
  return; 
}

ページ先頭へ戻る


DLLの作成

いよいよDLLの作成です。

メイクは案外簡単で、次の一行でOK。


cl -IC:\jdk1.1.8\include\win32 -LD HelloWorld.c /FeHelloWorld.dll

  • ひょっとすると、jni.hを\include\win32にマニュアルでコピーする必要があるかもしれません。

ページ先頭へ戻る


実行

以上で、必要な手順は完了です。さぁ、実行してみましょう。


D:\home\jnibasic>java HelloWorld
Helo World!!!

D:\home\jnibasic>

...うーん。ちょっとツマラナスギでしょうか?

ページ先頭へ戻る



ホームへ戻ります。 ラボへ移動します。 直前のページへ戻ります。 作者へメイルを送ります。


Copyright(C) 1997, S.Terada , All Rights Reserved