TOP →
Java →
JNI → This Page
JNI サンプル(引数の文字列配列に値をセットして返す)
前置き
ここでは
Javaの
JNI(Java Native Interface)の
サンプルを紹介します。
サンプル概要
Java から 引数が文字列の配列で、その配列に値をセットして返す C の関数を呼び出すサンプルです。
引数に数字を渡すと、その数だけ配列に文字列をセットして返します。
SampleJava6.java
呼び出す側(Java)として以下のファイルを作成します。
public class SampleJava6 {
// ライブラリをロード
static {System.loadLibrary("SampleC6");}
// ネイティブメソッドを宣言
native void createString(int num, String[] ret);
public static void main(String[] args) {
SampleJava6 main = new SampleJava6();
int num = 5;
String[] ret = new String[num];
main.createString(num, ret);
for (int i = 0; i < num; i++) {
System.out.println(ret[i]);
}
}
}
|
コマンドプロンプトを開き、以下のコマンドでコンパイルします。
(パスは SampleJava6.java を作成したフォルダにして下さい)
SampleJava6.h
コマンドプロンプトを開き、以下のコマンドでヘッダファイルを出力します。
(パスは SampleJava6.java を作成したフォルダにして下さい)
すると以下の内容のファイルが作成されます。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class SampleJava6 */
#ifndef _Included_SampleJava6
#define _Included_SampleJava6
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: SampleJava6
* Method: createString
* Signature: (I[Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_SampleJava6_createString
(JNIEnv *, jobject, jint, jobjectArray);
#ifdef __cplusplus
}
#endif
#endif
|
SampleC6.cpp
呼び出される側(C)として以下のファイルを作成します。
先ほど Java を作成したフォルダと同じフォルダに作成して下さい。
#include <windows.h>
#include "SampleJava6.h"
JNIEXPORT void JNICALL Java_SampleJava6_createString
(JNIEnv *env, jobject obj, jint num, jobjectArray retObj) {
int count = num;
int i;
for (i = 0; i < count; i++) {
const char *pBuff = "あいうえお";
int len = strlen(pBuff);
// Unicode文字列の長さを取得
int uniLen = MultiByteToWideChar(CP_ACP, 0, pBuff, len, NULL, 0);
WCHAR *retBuff = new WCHAR[uniLen];
// Unicode文字列に変換
MultiByteToWideChar(CP_ACP, 0, pBuff, len, retBuff, uniLen);
// Javaの文字列生成
jstring jstr = env->NewString((jchar *)retBuff , uniLen);
delete retBuff;
// 配列の指定インデックスに文字列をセット
env->SetObjectArrayElement(retObj, i, jstr);
}
/*
// 日本語(全角文字)を使わないのであれば以下だけで対応可能
int i;
for (i = 0; i < count; i++) {
char* src = "abcdefg";
jstring jstr = env->NewStringUTF(src);
// 配列の指定インデックスに文字列をセット
env->SetObjectArrayElement(retObj, i, jstr);
}
*/
}
|
コマンドプロンプトを開き、以下のコマンドでコンパイルします。
(パスは SampleJava6.java を作成したフォルダにして下さい)
bcc32 -IC:\j2sdk1.4.2_08\include -IC:\j2sdk1.4.2_08\include\win32 -tWD SampleC6.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 SampleC6.cpp
|
サンプルの実行
コマンドプロンプトを開き、以下のコマンドで実行します。
(パスは SampleJava6.java を作成したフォルダにして下さい)
あいうえお
あいうえお
あいうえお
あいうえお
あいうえお
と表示されれば成功です。
サンプルのダウンロード
サンプルのダウンロード
更新履歴
2008/04/01 コンパイル時のパスについて注意点追加
2007/12/01 Javaのコーナー細分化に伴い、URL の変更
TOP →
Java →
JNI → This Page