我想从java函数中的C函数显示来自二维char数组的5x5字符网格。我目前使用的代码返回一个正确的5x5网格,但网格中的所有字符都显示为空或随机符号。我使用以构建被返回数组的代码如下:从C函数返回二维字符数组到Java JNI
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'是一个数组,就像注释所说的那样,'returns rows;'只返回一个指针而不是一个数组,返回一个现在无效的对象。建议使用完整的最小代码示例来复制此问题, – chux