从java传递的c中的打印数组:为什么不打印数组?

时间:2012-05-10 10:30:38

标签: java c arrays java-native-interface

以下 java 代码段调用 c 函数:

Java代码

 String s[] = new String[10];
    for(int i=0;i<10;i++) {
        s[i] = "s";
    }
    o.printArrayLength(s); // prints the array length from c code

C代码:

void Java_Package_CallMethodOfSuperClass_printArrayLength
    (JNIEnv *env, jobject obj, jobjectArray arr) {

jsize size = (*env)->GetArrayLength(env,arr);
printf("\n");
printf("Size of array from C : ");
printf("%d",size);
jcharArray chrArr = (*env)->GetCharArrayElements(env,arr,NULL);
char Arr[11];
strcpy(Arr,chrArr);
int i = 0;
printf("Now printing the array declared in java from c :");
printf("SIZE SIZE SIZE SIZE : %d",size);
for(i=0;i<size;i++) {
    printf("Inside for loop !");
    printf("%s",Arr[i]);
}
     //jobjectArray obArr = (*env)->NewObjectArray(env,size,(*env)->FindClass(env,"[L"),NULL);
    //(*env)->SetObjectArrayElement(env,obArr,0,chrArr);
}

当发生以上情况时,我会看到以下输出:

Size of array from C : 10
Now printing the array declared in java from c :
SIZE SIZE SIZE SIZE : -549339085 // What the heck !

为什么我得到大小不同于10的值。值10在之前打印1行。

接下来如果我将for循环中的检查保持为10,那么阵列也不会打印出来。为什么是这样 ?相反,我得到一个致命的错误。

1 个答案:

答案 0 :(得分:5)

您应该观察编译器警告,其中应该有几个警告。这段代码坏了。

您正在声明一个包含11个字符(Arr)的数组,但将其视为包含10个字符串的数组。 C中的字符串表示为char的指针。您的strcpy()很可能会超过Arr,导致size的价值发生变化。