Java中布尔数组的奇怪腐败

时间:2012-11-29 18:35:08

标签: java arrays if-statement java-native-interface boolean

这可能听起来很奇怪,但过去2天我一直在努力解决这个问题。

  1. 我在java中有一个boolean数组,它使用Random布尔生成器进行初始化。

  2. 之后,boolean数组被C中的函数(使用JNI调用)操作,修改后的boolean数组返回给java。当我将boolean数组移交给C时,它会转换为unsigned char并转换回jbooleanArray,然后再传回给java。

  3. 现在我运行以下代码(i上有for循环):

    if(chosen_packet[i] == false)
    {
         pkt.first[i] = 0;
         System.out.print(chosen_packet[i]);
    }
    if(chosen_packet[i] == true)
    {
         pkt.first[i] = 1;
         System.out.print(chosen_packet[i]);
    }
    
  4. 问题在于,有时当chosen_packet[i]true时,它仍然没有进入第二个if条件。有时会发生这种情况,有时候代码运行得很好。当我在这种情况下打印chosen_packet[i]时,它会打印为true但它不会进入第二个if条件。这可能是boolean数组看似腐败的可能原因?

    编辑:这就是我在C中将boolean数组转换为unsigned char的方式:

     jboolean *element = (*env)->GetBooleanArrayElements(env,chosen_packet,0);
     for(j = 0; j < sz; j++)
              src_pkt[j] = (unsigned char)element[j];
    

    对此src_pkt采取行动,然后将其转换回jboolean

    EDIT2:这是我将unsigned char数组转换回jboolean:

    的方法
     jbooleanArray arr = (*env)->NewBooleanArray(env,sz);
     (*env)->SetBooleanArrayRegion(env,arr,0,sz,src_pkts);
     (*env)->DeleteLocalRef(env,arr);
    

2 个答案:

答案 0 :(得分:1)

如果booleantrue,则不会输入第一个if,因为您要检查false是否为if/else,这是正常的。

您的代码可以简化为(如果检查不同的条件,则应使用if (chosen_packet[i]) { pkt.first[i] = 1; } else { pkt.first[i] = 0; } System.out.print(chosen_packet[i]); 而不是两个。)

pkt.first[i] = chosen_packet[i] ? 1 : 0;
System.out.print(chosen_packet[i]);

甚至

chosen_packet[i]

修改

如果您的程序没有输入第二个if,则表示var true不是chosen_packet[i],您可以使用调试器来验证实际值是什么。

fredcrs 所述,您确定boolean的类型为{{1}}吗?

答案 1 :(得分:1)

Java boolean通常实现为单字节。因此,您的C代码中可能存在一个错误,导致boolean既不是true也不是false。在这种情况下,您可能会遇到未定义的行为。

请注意,将unsigned char简单地投放到jboolean (jboolean) src_pkt[j]并不会将其标准化。您必须使用src_pkt[j] ? JNI_TRUE : JNI_FALSE

我仍然相信您必须发布更多JNI代码的相关部分。