对于那些了解jaotc的人,我有一个简单的问题。
完成后
javac HelloWorld.java
jaotc --output HelloWorld.so HelloWorld.class
你可以运行
java -XX:AOTLibrary=./HelloWorld.so HelloWorld
没有任何问题。这是互联网上到处显示的内容。好吧,我。
但是,如果将HelloWorld.class移动到不在类路径中的其他位置,并运行
java -XX:AOTLibrary=./HelloWorld.so HelloWorld
再次,那么你会得到一个未找到类的错误。
那么仍然需要原始的.class文件?那么做AOT有什么意义呢?
答案 0 :(得分:0)
是的,至少到目前为止。您可以参考http://openjdk.java.net/jeps/295:
由于类字节码可以随时间变化,因此可以通过更改 源代码或通过类转换和重新定义,JVM 需要检测此类更改并拒绝AOT编译的代码,如果 字节码不匹配。这是通过类指纹实现的。 在AOT编译期间,将生成每个类的指纹,并 存储在共享库的data部分中。后来上课的时候 已加载并找到此类的AOT编译代码, 将当前字节码的指纹与存储在其中的指纹进行比较 共享库。如果不匹配,则该AOT代码 没有使用特定的类。
答案 1 :(得分:0)
当我发现在我的本机版本的Minecraft中唯一加载的Java本机映像是java.base中的一个时,我对此表示怀疑。我不知道为什么,直到我读了这篇文章。
如果可能的话,AOT图像只是替代图像。它们不能替代原始Java字节码。
仅当JVM参数不同和/或在不同平台上运行时,才执行此操作。我相信,如果您要制作Java本机应用程序,则IKVM.NET会更适合您的目的。