Sto usando un lettore RFID , che esegue Linux con la versione 1.5.0 jamvm su di esso (posso solo distribuire applicazioni ad esso - Non riesco a cambiare la Java VM o nulla così le mie opzioni sono limitate) - ecco quello che vedo quando controllo la versione:JamVM su Motorola FX9500 Problemi - cosa devo fare?
[[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
ho bisogno di scrivere un'applicazione in modo ho afferrato l'Oracle Java SDK 1.5.0 e installato sul mio PC Windows 7, quindi ha questa versione:
C:\>javac -version
javac 1.5.0
Sono troppo idealista nel considerare che un'applicazione che compilo con quel compilatore funzionerebbe co rettamente su JamVM di cui sopra? In ogni caso, premendo sul nell'ignoranza scrivo questa piccola applicazione:
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);
}
}
compilarlo con il suddetto compilatore javac e eseguirlo sul PC in questo modo:
C:\>javac TestApp.java
C:\>java TestApp
8
lì tutto bene. La vita è bella, così prendo file .class
e posizionarlo sul FX9500 ed eseguirlo in questo modo:
[[email protected] ~]$ /usr/bin/jamvm TestApp
-2
Eek, ciò che la ... come si può vedere - restituisce un risultato diverso.
Quindi, perché e chi ha torto o è qualcosa di simile alle specifiche non è chiaro su come gestire questo calcolo (sicuramente no)? Potrebbe essere che ho bisogno di compilarlo con un compilatore diverso?
Perché mi interessa di questo?
Il motivo sono venuto a questa situazione è che un calcolo esattamente come quello che accade dentro java.lang.Long.toString
e ho un bug nel mio vero applicazioni dove sto logout un lungo e ottenere un java.lang.ArrayIndexOutOfBoundsException
. Poiché il valore che desidero registrare potrebbe essere molto utile alle estremità di un Long
.
Penso di poter aggirare il problema controllando Long.MIN_VALUE e Long.MAX_VALUE e registrando "Err, non posso dirvi il numero ma è davvero Long.XXX, credetemi, vorrei mentire a voi ?". Ma quando lo trovo, sento che la mia applicazione si basa su una base sabbiosa e deve essere davvero robusta. Sto seriamente pensando di dire semplicemente che JamVM non è all'altezza del compito e sta scrivendo l'applicazione in Python (dato che il lettore ha anche un runtime Python).
Sto sperando che qualcuno mi dica che sono un idiota e avrei dovuto compilarlo sul mio PC Windows come .... e poi funzionerebbe, quindi per favore dimmi che (se è vero , ovviamente)!
Aggiornamento
Noofiz mi ha fatto pensare (grazie) e ho messo incinta questa applicazione di test aggiuntiva:
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");
}
}
io, ancora una volta, compilo sulla macchina Windows ed eseguirlo.
Esso stampa Phew, that was a close one
ho copiare il file .class
per l'aggeggio in questione ed eseguirlo.
Esso stampa ...
... attendere che si ...
W....T.....F
Oh cara. Mi sento un po 'stordita, penso di aver bisogno di una tazza di tè ...
Update 2
Un altra cosa ho provato, che non ha fatto alcuna differenza, è stato quello di copiare il classes.zip e glibj.zip file off del FX9500 al PC e poi fare una croce compilare in questo modo (che deve significare il file compilato dovrebbe andare bene giusto?):
javac -source 1.4 -target 1.4 -bootclasspath classes.zip;glibj.zip -extdirs "" TestApp2.java
ma il file .class risultante, quando eseguito su il lettore stampa lo stesso messaggio.
+1 per un filato ben filato (vale a dire una domanda ben scritta e divertente), penso. Non c'è un compilatore jamvm per Windows che potresti provare? Non sono sicuro che un normale compilatore SDK lo faccia ... –
Grazie. Non sono riuscito a trovare un compilatore jamvm, penso che sia solo una macchina virtuale. – kmp
Hai provato a utilizzare l'operazione modulo personalizzato. Intendo un - (a/b) * b invece di un% b. Potrebbe esserci qualche differenza nell'implementazione. Le operazioni di aggiunta e negazione sono semplici per causare problemi. – Mikhail