- PR -

JNIでString配列へのフィールドアクセス方法について

1
投稿者投稿内容
茄子
会議室デビュー日: 2008/01/10
投稿数: 2
投稿日時: 2008-01-29 15:29
JavaからC言語で作成したDLLを呼んでいます。
DLLへの入力はパラメータで渡し、出力はC側からフィールドへアクセスしてデータを返すように書いてます。

Java側のString配列のフィールドへアクセスする方法について教えていただけないでしょうか。
同じロジックでDouble配列も、フィールドへアクセスして値をJava側へ返しているのですが、こちらはうまく動作しています。

Double型では以下のように書いて上手くデータが取得できてます。

Java側-------------------------
double[] Score = new double[2];

System.out.println(Score[0]);
System.out.println(Score[1]);
-------------------------------

C側----------------------------
jfieldID id_dDF = (*env)->GetFieldID(env,cls,"Score","[D");
jobject objScore = (*env)->GetObjectField(env, cObj, id_dDF);
double *pdbl = (*env)->GetDoubleArrayElements(env,(jdoubleArray)objScore,0);
pdbl[0] = 1.234;
pdbl[1] = 9.876;
(*env)->ReleaseDoubleArrayElements(env, (jdoubleArray)objScore, pdbl, 0);
--------------------------------

同じようにJava側のString配列へ文字列を返したいのですが、うまくいきません。

よろしくお願いします。
yos
常連さん
会議室デビュー日: 2004/08/24
投稿数: 27
投稿日時: 2008-01-29 17:32
引用:

茄子さんの書き込み (2008-01-29 15:29) より:

同じようにJava側のString配列へ文字列を返したいのですが、うまくいきません。



うまくいかないとは、どういう現象でしょうか?
Stringなら、期待する動作ができているのですか?

うまくいかないというコードを[CODE]タグで括って載せてみてください。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2008-01-29 18:17
「返したい」だけで反射で書いてしまったようで…元々Java側から渡してるんですね。

失礼しました。

>NewObjectArray?

[ メッセージ編集済み 編集者: mio 編集日時 2008-01-29 19:08 ]
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2008-01-29 18:18
引用:

茄子さんの書き込み (2008-01-29 15:29) より:

同じようにJava側のString配列へ文字列を返したいのですが、うまくいきません。



Stringはプリミティブ型ではないので、JNIでdouble型と同じように扱うことができません。


こんな感じで、どうですか?
コード:
	/* String配列のフィールドの取得 */
	idStrings = (*env)->GetFieldID(env ,cls, "Strings", "[Ljava/lang/String;");
	objStrings = (*env)->GetObjectField(env, obj, idStrings); 

	/* 配列サイズ分だけ文字列をセット */
	sizeStrings = (*env)->GetArrayLength(env, objStrings);
	for (i = 0; i < sizeStrings; i++) {
		char str[256];
		jstring jstr;

		sprintf(str, "String%d", i);
		jstr = (*env)->NewStringUTF(env, str);

		(*env)->SetObjectArrayElement(env, objStrings, i, jstr);
	}

茄子
会議室デビュー日: 2008/01/10
投稿数: 2
投稿日時: 2008-01-29 19:22
yos様、mio様、Tdnr_Sym様

返信ありがとうございました。
また、投稿では拙い文章で申し訳ありませんでした。

引用:
うまくいかないとは、どういう現象でしょうか?
Stringなら、期待する動作ができているのですか?



double型と同じ方法を真似しても、コンパイルすら出来ない状態でした。
double型とは同じように扱えないのですね。

String型ではうまく出来たのですが、double型で配列のフィールド取得に成功するまでは、200個くらいの変数をJava側に宣言してたので、これではあまりにも・・と思い配列を使うように修正を始めたのですが、Stringの配列でつまづいていた次第です。

サンプルプログラムまで書いていただいて、大変助かりました。
おかげさまで、Java側のString配列にデータがうまく入りました。

これを参考に実際のプログラムに組み込んでいきます。

皆さま、ありがとうございました。
1

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