2

我决定尝试将 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

有人建议如何解决这个问题?

4

1 回答 1

-3

所以在我看来,你想反编译 Minecraft,大概是为了改装。如果是这样,请查看 Minecraft Coder Pack。它是一系列真正使反编译、重新编译和重新混淆变得非常容易的程序。

您可以在此处查看该程序。

但是,如果您出于改装原因没有进行反编译,那么请忽略这一点:)

于 2012-11-10T10:55:21.090 回答