java - LLVM:无法让 vmjc 工作

标签 java llvm emscripten

我想使用 LLVM 将 Java 编译为 Javascript,如下所示:

  • *.java 到 *.class,通过 Oracle 的 javac
  • *.class 到 *.bc,通过 vmkit 的 vmjc
  • 使用 JS 将*.bc 转换为 *.html,通过 emscripten 的 emcc

创建的 HTML/JS 文件(约 170KB 大)打开时会在浏览器控制台中打印 ReferenceError: _StartJnjvmWithoutJIT is not Define。尝试调试它时,我注意到 *.bc 文件(LLVM IR)甚至似乎不包含我的代码,即我正在打印的字符串不在里面。

我做了什么:

vmjc -disable-opt -main=MyTest MyTest.class

无论我使用 Java 6 还是 7,它都会打印出来:

WARNING: Class file 'java/lang/VMString' requires Java version 1.7. This JVM only supports Java versions up to 1.6.

无论如何,它都会创建一个 *.bc 文件。当我将其转换为非二进制 (*.ll) 时,我得到一个文件,我本希望在其中打印我的字符串,但它们没有出现。不过,像 MyTest_main 这样的字符串确实出现在那里:

llvm-dis MyTest.class.bc

那么,这种方法到底可行吗?关于 Java 版本的警告是什么意思?为什么我的“hello world”字符串没有出现在 *.ll 代码中,这是一个问题吗?

最佳答案

您可以通过使用 GWT 将 Java 直接编译为 JavaScript 来缩短路线。

关于java - LLVM:无法让 vmjc 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19902556/

相关文章:

java - Axis 安全 header

java - 如何使登录错误 ("Wrong username/password")在登录页面中更加具体

java - OSGi 片段是否应该导出为其主机贡献的包?

c++ - 如何找到类模板成员函数定义的外层模板参数列表的SourceLocation?

Windows 铿锵: Command-line too long

conditional-compilation - 如何有条件地为 emscripten 编译代码?

java - 使用 uniqueidentifier 主键获取实体时出现问题

c - LLVM 优化错误或未定义的行为?

javascript - 如何加载存储在子目录中的 .wasm 文件?

cmake - 使用 emscripten 时如何解析 freetype 头文件