2012-09-10 293 views
17

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

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

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

+0

重新实现整个LLVM代码库(或者至少是它的一大部分子集)会导致巨大的工作量浪费。只需像其他人一样调用C API即可。 – delnan

+0

但我正在使用的程序是Java,并且我不允许更改它。我从来没有写过关于重新实现它的所有内容。这不是我的意图,我在这里要求更简单的方法。 – gexicide

+0

这不是我的意思。例如,人们从O'Caml和Python调用LLVM。从Java调用C代码有多难? – delnan

回答

15

llvm java api bindings快速搜索原来,这似乎是一个不错的选择几个项目:

所有这些库的使用JNI来访问C-API,所以你有一个DLL或SO文件的LLVM它任何情况下都是自我。

5

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

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

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

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

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

使用这两种技术,你偶尔都会去查找枚举常量。如果它们不容易从头文件中读取,那么您将需要编写一个简单的C程序来打印出您感兴趣的常量,以便您可以手动将它们复制到Java接口。

7

基于当前的LLVM v3.6以更新的信息回答问题。您的选择是:

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

如果GPL授权对您有用,那么您一定要去RoboVM。这是一个积极的项目,对最新的LLVM版本提供强大的支持。 JLLVM和LLVM-J不再处于活动状态,因此您需要使用它们做一些额外的工作。

+1

该死的......连RoboVM都不见了...... – Silverclaw