【发布时间】:2013-04-05 08:07:28
【问题描述】:
我正在使用Motorola FX9500 RFID 阅读器,它运行带有jamvm 版本 1.5.0 的 Linux(我只能将应用程序部署到它 - 我无法更改 Java VM 或任何东西,因此我的选择有限) - 这是我检查版本时看到的:
[cliuser@FX9500D96335 ~]$ /usr/bin/jamvm -version
java version "1.5.0"
JamVM version 1.5.4
Copyright (C) 2003-2010 Robert Lougher <rob@jamvm.org.uk>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2,
or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
Build information:
Execution Engine: inline-threaded interpreter with stack-caching
Compiled with: gcc 4.2.2
Boot Library Path: /usr/lib/classpath
Boot Class Path: /usr/local/jamvm/share/jamvm/classes.zip:/usr/share/classpath/glibj.zip
我需要编写一个应用程序,所以我获取了 Oracle Java SDK 1.5.0 并将其安装到我的 Windows 7 PC 上,所以它有这个版本:
C:\>javac -version
javac 1.5.0
考虑到我使用该编译器编译的应用程序可以在上述 JamVM 上正常工作,我是否过于理想化了?无论如何,我在无知中继续写这个小应用程序:
public final class TestApp {
public static void main(final String[] args) {
long p = Long.MIN_VALUE;
int o = (int)(-(p + 10) % 10);
System.out.println(o);
}
}
用前面提到的 javac 编译器编译,然后在 PC 上运行,如下:
C:\>javac TestApp.java
C:\>java TestApp
8
那里一切都好。生活是美好的,所以我把那个.class 文件放在FX9500 上,然后像这样运行它:
[cliuser@FX9500D96335 ~]$ /usr/bin/jamvm TestApp
-2
哎呀,什么...正如你所看到的 - 它返回不同的结果。
那么,为什么以及谁错了,或者像规范一样不清楚如何处理这个计算(肯定不是)?难道是我需要用不同的编译器编译它?
我为什么要关心这个?
我遇到这种情况的原因是 java.lang.Long.toString 内部发生了与此完全相同的计算,而我的实际应用程序中有一个错误,我在其中长时间注销并获得 java.lang.ArrayIndexOutOfBoundsException。因为我想要记录的值很可能在Long 的末尾。
我想我可以通过检查 Long.MIN_VALUE 和 Long.MAX_VALUE 并记录“错误,我不能告诉你这个数字,但它确实是 Long.XXX,相信我,我会骗你吗? ”。但是当我发现这一点时,我觉得我的应用程序现在是建立在一个沙质的基础上的,它需要非常健壮。我正在认真考虑只是说 JamVM 不能胜任这项工作并用 Python 编写应用程序(因为阅读器也有 Python 运行时)。
我有点希望有人告诉我我是个笨蛋,我应该在我的 Windows PC 上编译它……然后它会起作用,所以请告诉我(如果这是真的,当然)!
更新
Noofiz 让我思考(谢谢),我敲开了这个额外的测试应用程序:
public final class TestApp2 {
public static void main(final String[] args) {
long p = Long.MIN_VALUE + 10;
if (p != -9223372036854775798L) {
System.out.println("O....M.....G");
return;
}
p = -p;
if (p != 9223372036854775798L) {
System.out.println("W....T.....F");
return;
}
int o = (int)(p % 10);
if (o != 8) {
System.out.println("EEEEEK");
return;
}
System.out.println("Phew, that was a close one");
}
}
我再次在 Windows 机器上编译并运行它。
它打印Phew, that was a close one
我将.class 文件复制到相关装置并运行它。
它打印...
...等一下...
W....T.....F
哦,亲爱的。我有点头晕,我想我需要一杯茶……
更新 2
我尝试的另一件事没有任何区别,是将 FX9500 上的 classes.zip 和 glibj.zip 文件复制到 PC,然后像这样进行交叉编译(这一定是编译后的文件应该没问题吧?):
javac -source 1.4 -target 1.4 -bootclasspath classes.zip;glibj.zip -extdirs "" TestApp2.java
但生成的 .class 文件在阅读器上运行时会打印相同的消息。
【问题讨论】:
-
+1 表示纺得很好(即问题写得很好,写得很有趣),我想。没有可以尝试的适用于 Windows 的 jamvm 编译器吗?不确定常规的 SDK 编译器是否可以...
-
谢谢。我找不到 jamvm 编译器 - 我认为它只是一个虚拟机。
-
您是否尝试使用自定义模数运算。我的意思是 a - (a/b)*b 而不是 a%b。可能在实现上有一些差异。 add 和 neg 操作直接导致问题。