1

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);
    }
}

したがって、この時点で、問題は次のいずれかであると推測しています。

  1. weeks.properties ファイルが libgcj に組み込まれませんでした。
  2. それはlibgcjにありますが、私の実行可能ファイルにはありません。
  3. それは実行可能ファイルにありますが、クラスローダーはそれを見つけることができません。

ここで何が起こっているのか、そしてそれを解決する方法を知っている人はいますか?

それが役立つ場合は、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

ありがとう、

バーニー

4

0 に答える 0