1

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

  1. boolean在 java 中有一个使用Random布尔生成器初始化的数组。

  2. 之后,booleanC 中的函数(使用 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阵列的这种看似损坏的可能原因是什么?

编辑:这就是我将boolean数组转换为unsigned charC 的方式:

 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);
4

2 回答 2

1

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

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

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

于 2012-11-29T18:44:37.887 回答
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,则表示 varchosen_packet[i]不是true,您可以使用调试器来验证真正的值是什么。

正如fredcrs 所说,你确定那chosen_packet[i]是 typeboolean吗?

于 2012-11-29T18:37:36.993 回答