0

次の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に保つと、配列も出力されません。どうしてこれなの ?代わりに、致命的なエラーが発生します。

4

1 に答える 1

5

コンパイラの警告を確認する必要がありますが、その中にはいくつかあるはずです。このコードは壊れています。

11 文字の配列 ( ) を宣言していますがArr、10 文字の配列として扱っています。C の文字列は、 へのポインタとして表されますchar。を上書きしているstrcpy()可能性が非常に高くArr、 の値がsize変化しています。

于 2012-05-10T10:34:49.183 に答える