- - PR -
JNIにおける基本型の二次元配列について
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-11-10 16:21
JNIにおけるJavaの基本型の二次元配列の取り扱いについて悩んでいます。
具体的には、JNIのネイティブソースの中で、jint[][]を新規作成してJavaオブジェクトのメソッドに引数として渡したいと考えています。 しかし、JNIにおけるjint[][]の新規作成方法、またはそれに代わる二次元配列の取り扱い方法がわかりません。 下記のような手順でObject配列にint配列を代入することで実現しようとしたのですが、 実行するとJNI上ではエラーにならないのですが、Java側でjava.lang.ClassCastExceptionが投げられ、 Object配列がint配列にキャストできない、といったメッセージが表示されます。 --- jclass obj = env->FindClass("java/lang/Object"); jobjectArray arr = env->NewObjectArray(num, obj, NULL); for (i = 0; i < n; i++) { jintArray is = env->NewIntArray(num); jboolean isCopy = JNI_FALSE; jint* p_is = env->GetIntArrayElements(is, &isCopy); env->SetObjectArrayElement(arr, i, is); for (j = 0; j < num; j++) { //配列に値を設定 } } env->CallVoidMethod(objClass, setTwoIntArray, arr); --- データをVectorとして扱う方法も考えていますが、何かよい方法はないでしょうか。 よろしくお願いします。 | ||||||||
|
投稿日時: 2007-11-10 17:39
jclass obj = env->FindClass("[I"); とするとどうなりますか? | ||||||||
|
投稿日時: 2007-11-10 18:56
いつはしです。
該当箇所を、jclass obj = env->FindClass("[I"); としました。 しかし、env->NewObjectArray()を呼んだ時点で落ちてしまいました。 Pure JavaでObject[]にint[]を代入した後、それをint[][]として扱う手段があれば、それをJNIでも同様に実装すればいいのかとも思いますが、不勉強なためそれもわからず…。 引き続きよろしくお願いします。 | ||||||||
|
投稿日時: 2007-11-12 11:15
Array.newInstance(int[].class, num) を使用するとうまくいくかもしれません。
上記 JNI のコードは動作確認していませんが、以下の Java コードでは Object を int[][] にキャストできることを確認しました。
| ||||||||
|
投稿日時: 2007-11-12 12:55
こんにちは。
汚いですがサンプルコードを作ってみました。 一応動作確認済みです。 参考までに。 Javaコード
C++ JNIコード
| ||||||||
|
投稿日時: 2007-11-12 18:01
すみません、今立込んでますのできちんと検証出来ない状態なのですが…
Tdnr_Symさんのコードは、見たところ私が初めに試した方法と同じ処理に見えます。 そのときは、JNIコード中でJavaオブジェクトに二次元配列を設定し、サーブレットに処理が戻るまでは問題なかったのですが、ネットワーク通信後にAppletがオブジェクトを受け取った辺りでClassCastExceptionが投げられてしまいました。 (何か見逃している単純なミスがあるのかもしれませんが。) 追って動作確認後、結果を報告いたします。ありがとうございました。 |
1