- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 java 中显示来自 C 函数的 2D 字符数组的 5x5 字符网格。我目前使用的代码返回正确的 5x5 网格,但是网格内的所有字符都显示为空或随机符号。我用来构造返回数组的代码如下:
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 字符数组。人物。 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; }
如果您有任何建议,我们将不胜感激,谢谢。
最佳答案
我采用的解决方案创建一个字符数组,然后将每个数组合并在一起以创建字符数组的 2D jobjectArray。对象数组的每一行都是一个字符数组。
JNIEXPORT jobjectArray JNICALL Java_MyClass_get2DArray(JNIEnv *env, jobject jObject){
jchar singleArrayRow[10]; //Change 10 to the width of the 2D array
jcharArray arrayRows[10]; //Change 10 to the height of the 2D array
//Looping through the array and adding the relevant characters to an array
int i, j, k, l;
for(i = 0; i < 10; i++){
for(j = 0; j < 10; j++){
//Using another array in order to passes the row of characters to createArrayRow function
singleArrayRow[j] = arrayOfChars[i][j]; //arrayOfChars is just the previously specified char **arrayOfChars
}
arrayRows[i] = createArrayRow(env, 10, singleArrayRow);
}
//Creating the object
jobjectArray rows = (*env)->NewObjectArray(env, 10, (*env)->GetObjectClass(env, arrayRows[0]), 0); //You can use any element of arrayRows[]
//Looping through the jobjectArray and aligning it each row object
for(i = 0; i < 10; i++){
(*env)->SetObjectArrayElement(env, rows, i, arrayRows[i]);
}
return rows}
createArrayRow(JNIEnv *env, int length, jchar rowChar[]) 函数接受java工作环境,后面是数组长度和要转换成jobjectArray的实际字符数组
static jcharArray createArrayRow(JNIEnv *env, int length, jchar rowChar[]){
//Creating an array of type jcharArray
jcharArray rowOfChars = (*env)->NewCharArray(env, length);
//Setting the region for the array
(*env)->SetCharArrayRegion(env, rowOfChars, 0, length, rowChar);
return rowOfChars;}
get2DArray() 函数中的最后一个 for 循环设置新创建的 jobjectArray 的每个元素、行,以及通过 createArrayRow() 函数创建的每个 jobjectArray。严格来说, get2DArray() 函数返回一个指向 jobjectArray 的指针,但 java 会为您解开该指针。
关于java - 将 2D 字符数组从 C 函数返回到 java JNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43491757/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!