1

我已经构建了一个在 Linux 上运行并生成 Windows 可执行文件的 gcj 交叉编译器,使用 binutils-2.22 和 gcc-4.6.3,并且主要遵循此处的注释:http ://rmathew.com/articles/gcj/bldgcj.html . 这一切都很顺利,直到我尝试使用 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. week.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