Java 简单赋值出现错误值

Java 简单赋值出现错误值,java,android,c++,java-native-interface,Java,Android,C++,Java Native Interface,对于为什么上面的代码会产生上面的值,有没有合理的解释?这个方法是从JNI调用的。传入的 x 最初是C++ >代码> int >代码>类型,即 StasyCase> > 金币>代码>,如: StasyType(x); 在调试器中,在y赋值上设置断点后,我看到x=640。走一行,我看到y=768。步进另一条线,c=320。使用调试器,我可以设置变量c=y,它将正确地将其赋值为768 这段代码是单线程的,每秒运行多次,并且始终观察到相同的结果 根据下面的评论进行更新 经过一天的调试,这个问题现在已经

对于为什么上面的代码会产生上面的值,有没有合理的解释?这个方法是从JNI调用的。传入的<代码> x <代码>最初是C++ >代码> int >代码>类型,即<代码> StasyCase> <代码> > <代码>金币>代码>,如:<代码> StasyType(x);<代码>

在调试器中,在y赋值上设置断点后,我看到x=640。走一行,我看到y=768。步进另一条线,c=320。使用调试器,我可以设置变量c=y,它将正确地将其赋值为768

这段代码是单线程的,每秒运行多次,并且始终观察到相同的结果

根据下面的评论进行更新

经过一天的调试,这个问题现在已经完全消失了。如果它一整天都不能重复发生,我会把它归咎于宇宙射线。很长一段时间以来我见过的最奇怪的事情


我会把这个问题留一段时间,以防有人对可能导致这个问题的原因有所了解。

第01步:正确编译,请参阅您文章下的评论

如果需要,我将使用此代码: C#代码:

但这是一个c代码

还有一个提示,你永远不要用编译器中使用的标准名称来调用你的函数。 convert是使用最多的语言

private void callConvert(object sender, EventArgs e)
        {
            string myString = Convert.ToString(convert123(640));
            textBox1.Text = myString;
        }
    private static int convert123(int x) {
    // assume we've passed in x=640.
    int y = (x + 64 + 127) & (~127);
    // as expected, y = 768
    int c = y;
    // c is now 320?!
    return (c);
}

你最近把c调到320了吗?如果是这样的话,它可能已经存储在一些内存中,编译器可能已经将它重新分配给它认为它是什么,而不是它应该是什么。不过,在某种程度上,我是在猜测。

若程序针对内存使用进行了优化,那个么它看起来像是临时变量的内存字节大小问题。调试器可能不可靠。我知道如果临时的~127存储在一个字节中,那么您可能会看到您观察到的场景。这取决于在运行时存储的是什么127。< /P>你是否将C++部分翻译成了代码> -O0?调试器可以对你撒谎。记录这些值,看看您得到了什么。@user2708138,
final
这里的意思是我不会在变量的初始值之后更改该变量的值。感谢您对解决问题的建议。但是,我可以通过在这个方法中进一步使用
y
来解决这个问题,以执行额外的工作。在这个问题上,我特别想要的是任何合理的解释,解释是什么导致了这个问题。我个人从未见过这样的事情,也不明白为什么会发生这样的事情,将其插入java类,编译成类文件,生成C++程序,创建JVM(版本1.6),查找类和方法,然后调用<代码> EnV-> CallStaticVoidMethod(class,方法,StasyType(640));代码>生成768。我不知道320是从哪里来的。。。如果您在没有JNI的情况下从java测试程序执行函数,它会起作用吗?它一定是来自JNI的另一面的某种潜在损坏-但非常奇怪的是,它会导致这样的效果,并且是可重复的。这并没有回答所问的问题--我正在寻找一种可能解释所看到的行为的解释,不工作的代码。谢谢。在这段代码中,
c
总是分配给
y
——而不是分配给其他任何东西。关于
c
是320,我唯一感兴趣的是它是
x
的一半,但我找不到除此之外这两者之间的联系。我很惊讶,编译器会责怪某些人吗?否则我不知道发生了什么。很奇怪。
private void callConvert(object sender, EventArgs e)
        {
            string myString = Convert.ToString(convert123(640));
            textBox1.Text = myString;
        }
    private static int convert123(int x) {
    // assume we've passed in x=640.
    int y = (x + 64 + 127) & (~127);
    // as expected, y = 768
    int c = y;
    // c is now 320?!
    return (c);
}
(system.convert)