jamvmバージョン1.5.0のLinuxを実行しているMotorola FX9500 RFIDリーダーを使用しています(私はアプリケーションをデプロイすることしかできません - Java VMなどのオプションを変更することはできません)。私はバージョンを確認する場合:Motorola 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
を私がアプリケーションを作成する必要があるので、私は、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上に置きますので、同じようにそれを実行します:あなたが見ることができるようにするもの...
[[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ランタイムを持っているので)。
私は誰かが私にダラードだと言いたいと思っています。私は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マシン上でコンパイルして実行します。
それは私が問題のからくりに.class
ファイルをコピーし、それを実行Phew, that was a close one
を印刷します。
それは...
...それを待つ...
W....T.....F
ああ親愛を印刷します。私はアップデート2は、任意の違いはありませんでした私が試したもうひとつ、
...私はお茶を必要だと思う、ビットwoozy感じclasses.zipをコピーしたとglibj.zipファイルをPCにFX9500のオフしてからのクロスが(つまり、コンパイル済みのファイルは罰金、右でなければなりません意味する必要があります?)そうのようにコンパイルします:
javac -source 1.4 -target 1.4 -bootclasspath classes.zip;glibj.zip -extdirs "" TestApp2.java
しかし、結果の.classファイル、上の実行時にリーダーは同じメッセージを出力します。
+1よく紡績された糸(すなわち質問がうまく楽しく書かれている)については、私は思う。 Windows用のjamvmコンパイラはありませんか?定期的なSDKコンパイラがそれをしているかわからない... –
ありがとう。私はjamvmコンパイラを見つけることができませんでした - 私はそれが単なる仮想マシンだと思います。 – kmp
カスタムモジュラス演算を使用しようとしましたか? %bの代わりに - (a/b)* bを意味します。実装に若干の違いがあるかもしれません。追加と否定の操作は問題を引き起こすためにまっすぐに進むことです。 – Mikhail