我想使用来自 Java 的 LLVM 代码生成框架。
即,我不想将Java 代码编译成LLVM。我只是想要一个可以从 Java 调用的用于代码生成的 LLVM 库。通常的 LLVM 库是 C,所以我不能使用它。
有没有 Java 端口?如果不是,那么最简单的方法是什么?将 API 封装到 JNI 中?
我想使用来自 Java 的 LLVM 代码生成框架。
即,我不想将Java 代码编译成LLVM。我只是想要一个可以从 Java 调用的用于代码生成的 LLVM 库。通常的 LLVM 库是 C,所以我不能使用它。
有没有 Java 端口?如果不是,那么最简单的方法是什么?将 API 封装到 JNI 中?
快速搜索llvm java api bindings发现了几个看起来很合适的项目:
所有这些库都使用 JNI 来访问 C-API,因此无论如何您都拥有 LLVM 本身的 DLL 或 SO 文件。
使用基于当前 LLVM v3.6 的更多最新信息来回答问题。您的选择是:
如果您可以接受 GPL 许可,那么您绝对应该选择 RoboVM。这是一个活跃的项目,对最新的 LLVM 版本提供强大的支持。JLLVM 和 LLVM-J 不再处于活动状态,因此您需要使用它们做一些额外的工作。
从 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 接口。