20

我想使用来自 Java 的 LLVM 代码生成框架。

即,我不想将Java 代码编译成LLVM。我只是想要一个可以从 Java 调用的用于代码生成的 LLVM 库。通常的 LLVM 库是 C,所以我不能使用它。

有没有 Java 端口?如果不是,那么最简单的方法是什么?将 API 封装到 JNI 中?

4

3 回答 3

19

快速搜索llvm java api bindings发现了几个看起来很合适的项目:

所有这些库都使用 JNI 来访问 C-API,因此无论如何您都拥有 LLVM 本身的 DLL 或 SO 文件。

于 2012-09-10T20:41:56.703 回答
8

使用基于当前 LLVM v3.6 的更多最新信息来回答问题。您的选择是:

  • RoboVM LLVM Java 绑定是 RoboVM 项目的一部分,支持当前的 LLVM v3.6(GPL 许可)。
  • LLVM-J已移至 Github 并支持 LLVM v3.0(MIT 许可证)。
  • JLLVM 支持 LLVM v3.2(LGBL 许可证)。

如果您可以接受 GPL 许可,那么您绝对应该选择 RoboVM。这是一个活跃的项目,对最新的 LLVM 版本提供强大的支持。JLLVM 和 LLVM-J 不再处于活动状态,因此您需要使用它们做一些额外的工作。

于 2015-04-17T10:04:20.057 回答
5

从 Java 访问 C 库的最简单方法是 JNA。您创建一个与您希望使用的 C API 部分同构的 Java 接口,然后 JNA 完成其余的工作。这意味着您只需在 API 更改时更新与您直接相关的方法。

https://github.com/twall/jna/blob/master/README.md

SWIG 更难使用,但如果您发现自己需要提高性能,JNA 可能是死胡同。JLLVM 是一个基于 SWIG 的工具,因此您可以考虑引用它或为您自己的目的分叉它。

不要使用基本的 JNI——在 SWIG 或 JNA 之间进行选择。

盲目地依赖历史最少的第三方包装器是一个冒险的命题,但如果你故意将这样的项目作为起点,你就不会出错。

使用这两种技术,您有时不得不四处寻找枚举常量。如果它们不容易从头文件中读取,您将需要编写一个简单的 C 程序来打印您感兴趣的常量,以便您可以手动将它们复制到您的 Java 接口。

于 2013-06-01T22:02:09.093 回答