JavaでJNIを使ってみる(4)
※実経験の記憶を頼りに自宅の PC 環境(VMWareなど)で再現している内容もあるのでご注意下さい
2007-11-16
前回、「JavaでJNIを使ってみる(3)」で JNI の簡単な使い方についてまとめましたが、実際に作った Java のサンプルプログラムとヘッダファイルの紹介です。今回は、下記の 4 つのメソッドを実装しています。
1.C++ 側で生成した文字列を表示する 2.引数で渡した 2 つの文字列を連結して表示する 3.引数で渡した数値に適当に数値を足して表示する 4.引数で渡したバイト配列から部分的にバイト文字を置換して表示する
Java のソースコードは以下の通りです。
public class JniSample {
// JNIモジュールのロード
static {
try {
System.loadLibrary("JniSample");
} catch (Exception e) {
System.out.println(e.getStackTrace());
}
}
// ネイティブメソッド
native public String getWord();
native public String getWordParam(String str1, String str2);
native public String getNumber(int num);
native public void getByteWord(byte arrByte[]);
// メイン
public static void main(String[] args) throws Exception {
// インスタンス
JniSample jniSample = new JniSample();
// getWord()呼び出し
System.out.println(jniSample.getWord());
// getWordParam()呼び出し
String msg = jniSample.getWordParam("ABCDE", "FGHIJ");
System.out.println(msg);
// getNumber()呼び出し
System.out.println(jniSample.getNumber(5));
// getByteWord()呼び出し
byte arr[] = new byte[5];
StringBuffer sb = new StringBuffer("");
for (int i = 0; i < arr.length; i ++) {
arr[i] = (byte)(i + 1);
}
jniSample.getByteWord(arr);
for (int i = 0; i < arr.length; i ++) {
sb.append(arr[i]);
}
System.out.println(sb.toString());
}
}
javah で生成したヘッダファイルは以下の通りです。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JniSample */
#ifndef _Included_JniSample
#define _Included_JniSample
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JniSample
* Method: getWord
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_JniSample_getWord
(JNIEnv *, jobject);
/*
* Class: JniSample
* Method: getWordParam
* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_JniSample_getWordParam
(JNIEnv *, jobject, jstring, jstring);
/*
* Class: JniSample
* Method: getNumber
* Signature: (I)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_JniSample_getNumber
(JNIEnv *, jobject, jint);
/*
* Class: JniSample
* Method: getByteWord
* Signature: ([B)V
*/
JNIEXPORT void JNICALL Java_JniSample_getByteWord
(JNIEnv *, jobject, jbyteArray);
#ifdef __cplusplus
}
#endif
#endif
関連記事
上記の記事に関連する記事(最新の10件)です。


