- PR -

JNI char[]配列のC→JAVAへの受け渡し

1
投稿者投稿内容
NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2005-11-01 18:18
JNI char[]配列のC→JAVAへの受け渡しについてお尋ねします。
下記、C側からnameを設定し、JAVA側でnameをSystem.outしたいのですが nullがセットされてしまいます。
「H」表示を期待しています。

ちなみに、int の 「22」は表示されます。

C側には自信がないのですが、何か思い違いをしておりますでしょうか?

**抜粋**
-=-=JNITest.java-=
public static void main(String[] args){
JNITest test = new JNITest();
Param prm = new Param();
test.paramfunc(prm);
System.out.println("NUM:" + prm.getNumber());
char[] c = prm.getName();
System.out.println("LNG:" + c[0]); //null pointer Exception
}

-=-=Param.java-=-=
class Param{
private char[] name;
public void setName(char[] str){
name = str;
}
public char[] getName(){
return name;
}
}

-=-=jni.c-=-=
JNIEXPORT void JNICALL Java_JNITest_paramfunc(JNIEnv *env, jobject obj, jobject prm){
jclass clazz;
jmethodID mid1, mid2;
jchar c[5];
c[0] = 'H';
c[1] = 'E';
c[2] = 'L';
c[3] = 'L';
c[4] = 'O';

clazz = (*env)->GetObjectClass(env, prm);
mid1 = (*env)->GetMethodID(env, clazz, "setNumber", "(I)V");
mid2 = (*env)->GetMethodID(env, clazz, "setName", "([C)V");
(*env)->CallVoidMethod(env, prm, mid2, c);//うまく行かない。
//(*env)->CallVoidMethod(env, prm, mid1, 22);//intの受け渡しはOK。
}

環境:WinXP / Java1.4 / MS Cコンパイラ

以上、よろしければアドバイス頂けないでしょうか?


[ メッセージ編集済み 編集者: NV 編集日時 2005-11-01 18:23 ]

[ メッセージ編集済み 編集者: NV 編集日時 2005-11-01 18:24 ]
NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2005-11-02 10:31
自己レスです。解決しました。
少々操作が足らなかったようです。

やはり、ネイティブ(C)側の記述不足でした。

-=-=jni.c-=-=
JNIEXPORT void JNICALL Java_JNITest_paramfunc(JNIEnv *env, jobject obj, jobject prm){
jclass clazz;
jmethodID mid1, mid2;
jint start_point;
jint array_length;
jcharArray jcArr;
jchar jc[6];
jc[0] = (jchar)'H';
jc[1] = (jchar)'E';
jc[2] = (jchar)'L';
jc[3] = (jchar)'L';
jc[4] = (jchar)'O';

start_point = (jint)0;
array_length = (jint)5;

//JNI char配列を作成(要素の数だけ)
jcArr = (*env)->NewCharArray(env, sizeof(jc));
//char配列に、値をコピー(らしい)し設定
(*env)->SetCharArrayRegion(env, jcArr, start_point, array_length, jc);

clazz = (*env)->GetObjectClass(env, prm);

mid1 = (*env)->GetMethodID(env, clazz, "setNumber", "(I)V");
mid2 = (*env)->GetMethodID(env, clazz, "setName", "([C)V");
(*env)->CallVoidMethod(env, prm, mid1, 22);
(*env)->CallVoidMethod(env, prm, mid2, jcArr); //動作した!!
}

これが正しいかどうかは保証できませんが、とりあえず思うように動作しました。
具体的な調査と検証は今後です…。

とりあえず、ご参考まで。
お騒がせしました。

http://www.northvan.jp/modules/bwiki/index.php?JNI%28Java%20Native%20Interface%29#content_1_5

[ メッセージ編集済み 編集者: NV 編集日時 2005-11-02 11:16 ]
1

スキルアップ/キャリアアップ(JOB@IT)