我已经使用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);
}
}
所以在这一点上我猜测问题是:
有谁知道这里到底发生了什么,以及如何解决?
如果有帮助,构建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
谢谢,
巴尼