我已经构建了一个在 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);
}
}
所以在这一点上,我猜问题是其中之一:
- week.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
谢谢,
巴尼