这可能听起来很奇怪,但过去2天我一直在努力解决这个问题。
我在java中有一个boolean
数组,它使用Random
布尔生成器进行初始化。
之后,boolean
数组被C中的函数(使用JNI调用)操作,修改后的boolean
数组返回给java。当我将boolean
数组移交给C时,它会转换为unsigned char并转换回jbooleanArray
,然后再传回给java。
现在我运行以下代码(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);
答案 0 :(得分:1)
如果boolean
为true
,则不会输入第一个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代码的相关部分。