private static void convert(int x) {
// assume we've passed in x=640.
final int y = (x + 64 + 127) & (~127);
// as expected, y = 768
final int c = y;
// c is now 320?!
}
以上代码为什么会产生上述值的合理解释?此方法是从JNI中调用的。传递的x
最初是C++的int
类型,被static_cast
转换为jint
类型,如下所示:static_cast<jint>(x);
在调试器中,当断点设置在y赋值语句处时,我看到x=640。向前单步执行一行,我看到y=768。再向前单步执行一行,c=320。使用调试器,我可以将变量c=y,并且它会正确地分配为768。
此代码是单线程的,每秒运行多次,并且总是观察到相同的结果。
以下是来自下面评论的更新信息
经过一天的调试后,这个问题现在已经完全消失了。如果它没有在整整一天内可重现的话,我会怀疑宇宙射线的原因。这是我很久以来见过的最奇怪的事情。
我会保留此问题一段时间,以便有人能对可能导致这种情况发生的原因有所了解。
System.out.println(c);
,将其放入Java类中,编译成一个类文件,创建一个创建JVM(版本1.6)的C ++程序,查找类和方法,然后调用env->CallStaticVoidMethod(class, method, static_cast<jint>(640));
,它会产生768。我不知道320来自哪里...如果您在没有JNI的情况下从Java测试程序中执行该函数,它是否有效? - Jerry Jeremiah