2000年3月22日星期三

JNI編


◆JNIとは?
 JNIJava Native Interfaceの略です。Javaのプログラムから他の言語(C言語やC++言語など)で開発されたネイティブコードのプログラムを利用するためのAPIです。
◆ここでの環境
OS Windows 2000(Windows)

RedHat Linux 7.3(Linux)
J2SE SDK 1.4.1_01
Cコンパイラ Borland C++
コンパイラー 5.5(Windows)

gcc 2.96-110(Linux)
◆Java実行環境の構築
アプリケーション編を参考にしてJavaの実行環境を構築してください。
◆コンパイラの用意

<Windowsの場合>

ここではフリーのBorland C++ コンパイラー 5.5を使用します。
■コンパイラのダウンロード
BorlandからC/C++言語のコンパイラをダウンロードします。
Borland
C++ コンパイラ 5.5のダウンロード
■コンパイラのインストール
ダウンロードしたファイルを実行してインストールします。
■環境変数PATHの設定
C:\borland\bcc55\Binを環境変数PATHに追加してください。環境変数の設定方法はアプリケーション編を参考にしてください。
■bcc32.cfgファイルの作成
以下の内容でC:\borland\bcc55\Bin\bcc32.cfgファイルを作成します。
bcc32.cfg
-IC:\borland\bcc55\Include
-LC:\borland\bcc55\lib

<Linuxの場合>
gccを使用します。インストールされていない場合はインストールCDもしくはhttp://gcc.gnu.org/からダウンロードしてインストールしてください。
 
◆Javaソースコード
HelloWorldJNI.java(ここからダウンロード)
public class HelloWorldJNI {
  static {
    // ライブラリをロードします
    System.loadLibrary("HelloWorldJNI");
  }
  // ネイティブメソッドを宣言します
  public native String sayHelloWorld();

  public static void main(String[] args) {
    HelloWorldJNI hello = new HelloWorldJNI();
    // メソッドを実行して表示します
    System.out.println(hello.sayHelloWorld());
  }
}
 
◆Javaソースコードのコンパイル
<Windowsの場合>
コマンドプロンプト
C:\JavaHello\JNI>javac
HelloWorldJNI.java

C:\JavaHello\JNI>

<Linuxの場合>
Windowsの場合と同じです。
 
◆C++言語のヘッダーファイルの生成
ヘッダーファイルは以下のようにjavahというコマンドで生成できます。オプションには-jniを指定し、引数には上でコンパイルしたクラスの拡張子を除いたものを指定します。
<Windowsの場合>
コマンドプロンプト
C:\JavaHello\JNI>javah
-jni HelloWorldJNI

C:\JavaHello\JNI>

<Linuxの場合>
Windowsの場合と同じです。
これで、HelloWorldJNI.hというヘッダーファイルが生成されました。以下がそのファイルです。
HelloWorldJNI.h(ここからダウンロード)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class HelloWorldJNI */

#ifndef _Included_HelloWorldJNI
#define _Included_HelloWorldJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorldJNI
 * Method:    sayHelloWorld
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_HelloWorldJNI_sayHelloWorld
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif 
 
◆C++言語のソースファイルの作成
次にC++言語のソースファイルを作ります。以下がそのコードです。
HelloWorldJNI.cpp(ここからダウンロード)
#include "HelloWorldJNI.h"
JNIEXPORT jstring JNICALL 
             Java_HelloWorldJNI_sayHelloWorld (JNIEnv *env, 
                                               jobject obj ) {
    return env->NewStringUTF("Hello World");
}
ソースファイルができましたら次にコンパイルしてDLLファイルを作ります。
◆C++言語のソースのコンパイルとDLLの生成
<Windowsの場合>
ここでは上でインストールしたbcc32というコンパイラを使用します。
コマンドプロンプト
C:\JavaHello\JNI>bcc32
-IC:\j2sdk1.4.1_01\include -IC:\j2sdk1.4.1_01\include\win32
-tWD HelloWorldJNI.cpp


Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland

HelloWorldJNI.cpp:

警告 W8057 HelloWorldJNI.cpp 7: パラメータ 'obj' は一度も使用されない(関数
__std

call Java_HelloWorldJNI_sayHelloWorld(JNIEnv_ *,_jobject
*) )

Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

C:\JavaHello\JNI>

これで、HelloWorldJNI.dllというダイナミックリンクライブラリが作成されました。
 <Linuxの場合>
Linuxの場合、C++言語のソースをコンパイルするにはgccを使用します。
Linux コンソール
[tanaka@redhat JNI]$
gcc -shared -I/usr/java/j2sdk1.4.1_01/include/
-I/usr/java/j2sdk1.4.1_01/include/linux/ HelloWorldJNI.cpp
-o libHelloWorldJNI.so

[tanaka@redhat JNI]$
これでlibHelloWorldJNI.soというダイナミックリンクライブラリが作成されました。
(メモ)
Linuxの場合はダイナミックリンクライブラリのファイルの名前の先頭にlibとつけなければなりません。
 
◆Javaのプログラムの実行
■実行に必要なファイル
HelloWorldJNI.class メインとなるJavaのクラス
HelloWorldJNI.dll
(Windows)

libHelloWorldJNI.so (Linux)
Javaのプログラムから利用される

ダイナミックリンクライブラリ
さっそく実行してみましょう。
<Windowsの場合>
コマンドプロンプト
C:\JavaHello\JNI>java
HelloWorldJNI

Hello World

C:\JavaHello\JNI>

おおおお!表示されましたね!
 
<Linuxの場合>
■環境変数LD_LIBRARY_PATHの設定
Linuxの場合環境変数LD_LIBRARY_PATHを設定しなければなりません。libHelloWorldJNI.soファイルがあるディレクトリを指定します。ここではカレントディレクトリなので以下のようになります。
Linux コンソール
[tanaka@redhat JNI]$
export LD_LIBRARY_PATH=.

[tanaka@redhat JNI]$
■実行
Linux コンソール
[tanaka@redhat JNI]$
java HelloWorldJNI

Hello World

[tanaka@redhat JNI]$
おおおお!表示されましたね!

没有评论:

发表评论