C言語の関数から2次元文字配列の5x5グリッドをJavaで表示しようとしています。現在使用しているコードは正しい5x5グリッドを返しますが、グリッド内のすべての文字はヌル記号またはランダム記号として表示されます。私が構築するために使用していたコード配列を返すしているが、以下の通りであるC関数からJava JNIへの2D char配列の返却
JNIEXPORT jobjectArray JNICALL Java_MapJNI_look(JNIEnv *env, jobject jObject, jint x, jint y){
initializeMap();
jobjectArray lookRow[5];
char lookChars[5][5];
char *arrayPointer;
int i, j, k, l;
for(i = 0; i < 5; i++){
for(j = 0; j < 5; j++){
int posX = x + j - 5/2;
int posY = y + i - 5/2;
if(posX >= 0 && posX < getMapWidth() && posY >= 0 && posY < getMapHeight()){
lookChars[i][j] = map[posY][posX]; //todo check this is correct
}else{
lookChars[i][j] = 'X';
}
}
arrayPointer = &lookChars[i][j];
//Setting an element of the row array object to a particular sequence of map characters
//5 represents the 5x5 look window
lookRow[i] = createArrayRow(env, 5, arrayPointer);
}
//Creating an array that contains all the rows for the look window
//Any element of lookRow[] is valid when obtaining the class through GetObjectClass
jobjectArray rows = (*env)->NewObjectArray(env, 5, (*env)->GetObjectClass(env, lookRow[0]), 0);
for(k = 0; k < 5; k++){
(*env)->SetObjectArrayElement(env,rows,k, lookRow[k]);
}
return rows; }
initializeMap()関数は、単にと2Dのchar配列を埋めます「」文字。 createArrayRow()関数は以下の通りです:あなたが何か提案がありましたら
static jobjectArray createArrayRow(JNIEnv *env, jsize count, char* elements){
//Storing the class type for the object passed
jclass stringClass = (*env)->FindClass(env, "java/lang/String");
//Creating a jobjectArray out of the supplied information
//This creates an array that can be passed back to java
jobjectArray row = (*env)->NewObjectArray(env, count, stringClass, 0);
jsize i;
//Assigning each element of the newly created array object to a specific string
(*env)->SetObjectArrayElement(env, row, i, (*env)->NewStringUTF(env, elements));
return row; }
は、彼らは非常に高く評価されるだろう、ありがとう。
C言語で 'rows'がコメントのように配列の場合、' return rows; 'は現在無効なオブジェクトに配列ではなくポインタを返します。ここで問題を再現する完全で最小限のコードサンプルが推奨されていますが、 – chux