从mingw / gcj可执行文件加载属性文件的异常

时间:2012-08-25 12:36:29

标签: gcc mingw gcj

我已经使用binutils-2.22和gcc-4.6.3构建了一个在Linux上运行并生成Windows可执行文件的gcj交叉编译器,并且主要遵循此处的注释: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. 它位于可执行文件中,但是类加载器无法找到它。
  4. 有谁知道这里到底发生了什么,以及如何解决?

    如果有帮助,构建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
    

    谢谢,

    巴尼

0 个答案:

没有答案