binutils-2.22 と gcc-4.6.3 を使用して、Linux で実行され、Windows 実行可能ファイルを生成する gcj クロス コンパイラを構築しました。 . これはすべて、java.util.Calendar を使用しようとするまではうまく機能しますが、すべてが失敗します。
テストプログラム:
import java.util.Calendar;
public class Test {
public static void main(String[] args) {
try {
Calendar cal = Calendar.getInstance();
System.out.println(cal.toString());
} catch (Exception ex) {
System.err.println(ex.getMessage());
ex.printStackTrace();
}
}
}
以下でコンパイル:
/opt/xgcc/bin/i686-pc-mingw32-gcj -fjni --main=Test -o test.exe Test.java
例外:
Exception in thread "main" java.lang.ExceptionInInitializerError
at java.lang.Class.initializeClass(test.exe)
at java.util.Calendar.getInstance(test.exe)
at Test.<init>(test.exe)
Caused by: java.lang.NullPointerException
at java.io.InputStreamReader.read(test.exe)
at java.io.BufferedReader.fill(test.exe)
at java.io.BufferedReader.readLine(test.exe)
at java.util.Properties.load(test.exe)
at java.util.Properties.load(test.exe)
at java.util.Calendar.<clinit>(test.exe)
at java.lang.Class.initializeClass(test.exe)
...2 more
ソース コードを調べると、java.util.Calendar クラスに次の静的初期化子が含まれていることがわかります。
static
{
properties = new Properties();
try
{
properties.load(Calendar.class.getResourceAsStream("weeks.properties"));
}
catch (IOException exception)
{
System.out.println("Failed to load weeks resource: " + exception);
}
}
したがって、この時点で、問題は次のいずれかであると推測しています。
- weeks.properties ファイルが libgcj に組み込まれませんでした。
- それはlibgcjにありますが、私の実行可能ファイルにはありません。
- それは実行可能ファイルにありますが、クラスローダーはそれを見つけることができません。
ここで何が起こっているのか、そしてそれを解決する方法を知っている人はいますか?
それが役立つ場合は、gcj をビルドするために次の構成オプションを使用しました (Ranjit のサイトから)
$GCC_SRC_DIR/configure --prefix="$PREFIX" \
--with-sysroot="$SYSROOT" --with-build-sysroot="$SYSROOT" \
--target=$TARGET --host=$HOST --build=$BUILD \
--enable-languages=c,c++,java \
--with-gnu-as --with-gnu-ld \
--disable-shared --enable-static \
--disable-nls --disable-debug --disable-checking \
--enable-threads=win32 --disable-win32-registry --enable-sjlj-exceptions \
--enable-libgcj --without-x --disable-java-awt
ありがとう、
バーニー