- - PR -
JNI char[]配列のC→JAVAへの受け渡し
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 ] |
|
投稿日時: 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