タイトル
TOPJavaJNI → This Page

JNI サンプル(Javaパッケージがある場合のJNIサンプル)

前置き

ここではJavaJNI(Java Native Interface)のサンプルを紹介します。

サンプル概要

Java でパッケージを利用している場合は若干の注意が必要なのでサンプルで解説します。


サンプルのファイル・フォルダ構成

Java でパッケージを利用している場合はフォルダ構成によってコンパイルする際のパスが変わります。
また、ファイルの移動も必要になります。
本サンプルは以下のような構成とします。

C:\JniSample8
C:\JniSample8\aaa
C:\JniSample8\aaa\bbb
C:\JniSample8\aaa\bbb\SampleJava8.java
C:\JniSample8\aaa\bbb\SampleC8.cpp

SampleJava8.java は パッケージ aaa.bbb を利用

SampleJava8.java

呼び出す側(Java)として以下のファイルを作成します。
package aaa.bbb;

public class SampleJava8 {
	// ライブラリをロード
	static {System.loadLibrary("SampleC8");}
	
	// ネイティブメソッドを宣言
	public native String concat(String str1, String str2);
	
	public static void main(String[] args) {
		SampleJava8 main = new SampleJava8();
		
		// ネイティブメソッドを実行
		System.out.println(main.concat("山田", "太郎"));
	}
}

コマンドプロンプトを開き、以下のコマンドでコンパイルします。
(コマンドは C:\JniSample8\aaa\bbb で実行します)
javac SampleJava8.java

SampleJava8.h

コマンドプロンプトを開き、以下のコマンドでヘッダファイルを出力します。
(コマンドは C:\JniSample8 で実行します)
javah -jni aaa.bbb.SampleJava8

すると以下の内容のファイルが作成されます。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class aaa_bbb_SampleJava8 */

#ifndef _Included_aaa_bbb_SampleJava8
#define _Included_aaa_bbb_SampleJava8
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     aaa_bbb_SampleJava8
 * Method:    concat
 * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_aaa_bbb_SampleJava8_concat
  (JNIEnv *, jobject, jstring, jstring);

#ifdef __cplusplus
}
#endif
#endif

このファイル(aaa_bbb_SampleJava8.h)は C:\JniSample8 に生成されるので
このファイル を C:\JniSample8\aaa\bbb に移動します。

SampleC8.cpp

呼び出される側(C)として以下のファイルを作成します。
#include <string.h>
#include "aaa_bbb_SampleJava8.h"
JNIEXPORT jstring JNICALL Java_aaa_bbb_SampleJava8_concat
(JNIEnv *env, jobject obj, jstring str1, jstring str2) {
	char buf[256];
	
	const char *c1 = env->GetStringUTFChars(str1, 0);
	const char *c2 = env->GetStringUTFChars(str2, 0);
	
	// 文字列を連結する
	strcpy(buf, c1);
	strcat(buf, c2);
	
	env->ReleaseStringUTFChars(str1, c1);
	env->ReleaseStringUTFChars(str2, c2);
	
	// 連結した文字列を返す
	return env->NewStringUTF(buf);
}

コマンドプロンプトを開き、以下のコマンドでコンパイルします。
(コマンドは C:\JniSample8\aaa\bbb で実行します)
bcc32 -IC:\j2sdk1.4.2_08\include -IC:\j2sdk1.4.2_08\include\win32 -tWD SampleC8.cpp

(注意)
上記の C:\j2sdk1.4.2_08 部分は各自のマシンの JDK のパスにあわせて下さい。

警告は出るかもしれませんが、エラーが出なくて DLL が作成されればコンパイル成功です。


コンパイルのパスについての注意点
JDK のパスに半角スペースなどが含まれている場合は、パスをダブルクォートで囲む必要があります。
bcc32 -I"C:\Program Files\Java\j2sdk1.4.2_08\include" -I"C:\Program Files\Java\j2sdk1.4.2_08\include\win32" -tWD SampleC8.cpp


サンプルの実行

コマンドプロンプトを開き、以下のコマンドで実行します。
(パスは SampleJava8.java を作成したフォルダにして下さい)
java aaa.bbb.SampleJava8

山田太郎
と表示されれば成功です。

サンプルのダウンロード

サンプルのダウンロード


更新履歴

2008/04/01 コンパイル時のパスについて注意点追加
2007/12/01 Javaのコーナー細分化に伴い、URL の変更


TOPJavaJNI → This Page