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