C++和Scala之间有多少互操作性?

9

大家都知道Java和Scala,但是C++和Scala之间有多少互操作性呢?例如,一个能否使用另一个语言的类?


Java和Scala程序都在JVM上运行;C++生成平台相关的机器码。你在问什么?你是在寻找类似JNI的本地接口吗? - Kerrek SB
是的,JNI 就是我想到的。它只是一种从一种语言调用另一种语言的类的方式。 - Henry Henrinson
一旦你使用JNI在Java中公开了你的C++类,那么从Scala中使用它们就轻而易举了。(就像你从Scala中使用任何Java类一样。) - Mohan
Slinc似乎对此非常有用https://slinc.hammons.fr/docs/index.html - undefined
3个回答

22

这并不是那么简单。Java和Scala都在同一个虚拟机上运行,Scala被设计成能够很好地与Java一起工作。

C++生成本地代码,每个编译器生成本地代码的方式都不同。这意味着使用Visual Studio编译的某个类与使用gcc编译的另一个类之间无法轻松交互。

如果您需要与C++交互,需要使用JNI进行一些粘合http://en.wikipedia.org/wiki/Java_Native_Interface。我相信使用Scala应该很容易就能用它。

您可以使用Swig使交互变得更加舒适http://www.swig.org/


3
对于绑定用C或Fortran编写的本地库,我喜欢JNA(Java Native Access)。这是一种纯Java解决方案,需要的样板代码比JNI少得多。然而,针对C++,根据https://dev59.com/-3I_5IYBdhLWcg3wBuX3,JNI似乎是更好的选择。thoredge提出的JNAerator是另一个值得考虑的选择,并且还生成BridJ的绑定,可能可以填补JNA的一些空缺。 - Kipton Barros

1
为了实现这种互操作性,两种实现必须编译成相同的中间语言(即Java字节码、.Net IL、LLVM)。Scala.Net和C++/CLI是最接近的组合 - 都为.Net生成代码。但即使如此,情况也并不那么简单,因为Scala中的类和C++中的类代表着略微不同的东西。
通常,Scala代表针对Java VM的Scala,C++代表针对本地代码的C++,因此一般的答案应该是“与随机选择的任何其他两种语言之间的区别不大”。

C++/CLI 通常不会生成纯 IL 代码,而是生成混合的本机和托管代码 - 这就是它与 C# 不同的地方。因此,最好的情况是你可以希望在 Scala.NET 和 C# 之间实现代码重用... - Kerrek SB

1

我会去看看JNAerator。它可以从C/C++/Obj-C头文件构建桥梁到Java接口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接