【问题标题】:Weird corruption of Boolean Array in JavaJava中布尔数组的奇怪损坏
【发布时间】:2012-11-17 22:00:48
【问题描述】:

这听起来可能很奇怪,但过去 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]);
    }
    

问题是,有时当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);

【问题讨论】:

  • chosen_packet[i]true 时,为什么你期望你的第一个 if 执行?
  • 你确定 selected_pa​​cket 的类型是 Boolean[] 吗?或布尔[]
  • @RohitJain 我已经编辑了这个问题。有一个小错误。对此我深表歉意。
  • @fredcrs selected_pa​​cket 是 boolean[] 类型。 Boolean[] 和 boolean[] 有什么区别?
  • 您如何将其转换回来?通过投射(jboolean) src_pkt[j]?因为我认为那可能是错误的。

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


【解决方案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]);

编辑

如果你的程序没有进入第二个if,说明这个var chosen_packet[i]不是true,你可以使用调试器来验证真正的值是什么。

正如 fredcrs 所说,您确定 chosen_packet[i] 的类型是 boolean

【讨论】:

  • OP 正在询问第二个 if 块。当值为true 时,为什么它不进入第二个if?您的答案是通过不突出问题来简化语法。
  • @YogendraSingh 他编辑了他的帖子,因为他首先询问了第一个if
  • 问题中有错误。我很抱歉。不进入第二个if条件。
  • @Alex 当我打印chosen_packet[i] 变量时,它只打印为真,是的,它不会进入我写“chosen_packet[i] == true”的 if 条件。我可以使用其他调试方法吗?
【解决方案2】:

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

请注意,简单地将 unsigned char 转换为 jboolean 为 in(jboolean) src_pkt[j] 不会对其进行规范化。你必须使用src_pkt[j] ? JNI_TRUE : JNI_FALSE

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

【讨论】:

  • 我在上面的问题中添加了将 jboolean 转换为 unsigned char 的代码。
  • 您好,请您在n ? JNI_TRUE : JNI_FALSE 上扩展一下。 n 在这里代表什么?我应该这样写吗:if(chosen_packet[i] == JNI_TRUE') then src_pkt[i] = 1;
猜你喜欢
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
相关资源
最近更新 更多