我正在使用一個Motorola FX9500 RFID閱讀器,該閱讀器運行的Linux版本爲jamvm版本1.5.0(我只能部署應用程序 - 我無法更改Java VM或任何其他內容,因此我的選項有限) - 這是我所看到的當我檢查版本:摩托羅拉FX9500上的JamVM問題 - 我該怎麼辦?
[[email protected] ~]$ /usr/bin/jamvm -version
java version "1.5.0"
JamVM version 1.5.4
Copyright (C) 2003-2010 Robert Lougher <[email protected]>
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
我需要編寫一個應用程序,所以我抓住了甲骨文的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和像這樣運行:
[[email protected] ~]$ /usr/bin/jamvm TestApp
-2
伊克,什麼......你可以看到 - 它返回一個不同的結果。
那麼,爲什麼和誰的錯誤或者是這樣的規範是不清楚如何處理這個計算(當然不是)?難道我需要用不同的編譯器編譯它?
我爲什麼關心這個?
我來到這個局面的原因是,計算完全一樣發生內部java.lang.Long.toString
和我在實際應用中,其中我退出了漫長而得到一個java.lang.ArrayIndexOutOfBoundsException
的錯誤。因爲我想記錄的值很可能在Long
的末尾。
我想我可以通過檢查Long.MIN_VALUE和Long.MAX_VALUE並記錄「Err,我不能告訴你這個數字,但它確實是Long.XXX,相信我,我會騙你?」。但是當我發現這一點時,我覺得現在我的應用程序是建立在沙地基礎上的,它需要非常強大。我正在認真考慮只是說JamVM不能勝任這項工作,並用Python編寫應用程序(因爲讀者也有Python運行時)。
我很希望有人告訴我,我是一個dullard,我應該把它編譯到我的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
一個我嘗試過其他的東西,這並沒有什麼差別,是複製classes.zip和glibj.zip文件從FX9500的PC,然後做一個交叉編譯像這樣(必須意味着編譯後的文件應該是罰款吧?):
javac -source 1.4 -target 1.4 -bootclasspath classes.zip;glibj.zip -extdirs "" TestApp2.java
但由此產生的.class文件,當運行讀者打印相同的信息。
對於一種紡絲良好的紗線(即一個問題很好且有趣的書寫),我認爲是+1。沒有可用於Windows的jamvm編譯器嗎?不知道普通的SDK編譯器是否會這樣做... – 2013-04-05 08:13:26
謝謝。我找不到一個jamvm編譯器 - 我認爲它只是一個虛擬機。 – kmp 2013-04-05 09:00:27
您是否嘗試使用自定義模數操作。我的意思是 - (a/b)* b而不是%b。可能會有一些實施差異。添加和否定操作是直接導致問題。 – Mikhail 2013-04-05 09:00:35