我决定尝试将 minecraft 编译成原生二进制文件。
为此,我使用了以下内容(大约,优化可能有所不同):
gcj -c -O2 -fjni -findirect-dispatch ./minecraft.jar &
gcj -c -O2 -fjni -findirect-dispatch ./jinput.jar &
gcj -c -fjni -findirect-dispatch ./lwjgl.jar &
gcj -c -fjni -findirect-dispatch ./lwjgl_util.jar &
然后我尝试链接:
gcj -o mc_out -findirect-dispatch -fjni -L/natives/*64.so \
-L/usr/lib/jvm/java-1.5.0-gcj-4.4/jre/lib/amd64/server \
./*.o -ljvm \
--main=net.minecraft.client.Minecraft
但是如果我运行二进制文件,我会得到:
ryan@ryan ~/.minecraft/bin_native_test $ ./mc_out
libgcj failure: gcj linkage error.
Incorrect library ABI version detected. Aborting.
Aborted
现在,我改用:
gcj -o mc_out -findirect-dispatch -fjni -L/natives/*64.so ./*.o \
--main=net.minecraft.client.Minecraft
我得到:
ryan@ryan ~/.minecraft/bin_native_test $ ./mc_out
Exception in thread "main" java.lang.ExceptionInInitializerError
at java.lang.Class.initializeClass(libgcj_bc.so.1)
at org.lwjgl.LWJGLUtil.getPlatform(mc_out)
at org.lwjgl.Sys.createImplementation(mc_out)
at org.lwjgl.Sys.<clinit>(mc_out)
at java.lang.Class.initializeClass(libgcj_bc.so.1)
at org.lwjgl.Sys.getTime(mc_out)
at net.minecraft.client.Minecraft.F(mc_out)
at net.minecraft.client.Minecraft.main(mc_out)
Caused by: java.nio.InvalidMarkException
at java.nio.Buffer.reset(libgcj_bc.so.1)
at java.nio.DirectByteBufferImpl.duplicate(libgcj_bc.so.1)
at java.nio.DirectByteBufferImpl.asReadOnlyBuffer(libgcj_bc.so.1)
at org.lwjgl.LWJGLUtil.loadIcon(mc_out)
at org.lwjgl.LWJGLUtil.<clinit>(mc_out)
at java.lang.Class.initializeClass(libgcj_bc.so.1)
...7 more
有人建议如何解决这个问题?