斯卡拉本地人与JNI

时间:2018-03-01 17:12:12

标签: scala java-native-interface

我将原生API解除为Scala。似乎有两条路径:使用JNI或使用Scala Native。

JNI用法在Java中创建您想要的方法,然后在C中隐藏它们,您可以在其中编写C代码来访问您的API。 Pro:您可以直接使用本机API的数据结构。 Con:您的Scala代码现在还必须提供自己的本机包装库,增加了可移植性复杂的可能性,现在您将库包装两次,一次在JNI C中,以便将其放入JVM,然后再放入Java / Scala模块。很多工作,很多地方都有bug。我多次使用这条路径,我认为这是世界的方式。

然后是Scala本地,它反向并在Scala中隐藏C函数。亲:你不用C写,所以没有新的本地库,也没有双包装。 Con:看起来你只能举起Scala原生原语,因此无法访问复杂的原生数据结构。这使得本机库无法使用其数据结构。

正如预期的那样,它们都不是非常便携,但我是否有一些功能可以修复这些方法中的一种或两种的缺点?或者其他一些理由选择Scala原生于JNI?

1 个答案:

答案 0 :(得分:0)

Scala Native 不会“隐藏”基于 JVM 的 Scala 中的 C 函数。 Scala Native 是裸机/原生 C 语言的直接等价物,但使用 Scala 语法而不是 C 语法和 Scala 语义(没有任何基于 JVM 的语义)而不是 C 语义。如果您要选择 JNI,那么您可以想象在使用哪种语言从 JVM 外部调用 JNI 注入到 JVM 的问题范围内有 2 个选择:C 或 Scala Native。如果您选择 Scala Native 在基于 JVM 的基础架构(例如 Android)上编写 UI 代码,那么您也可以通过让 Scala Native 调用 JNI(而不是 C 调用 JNI)来有效地选择 JNI。 (这里提到的所有 C 也适用于 C++。)综上所述,利用 Scala Native 调用 JNI 从 JVM 外部执行 UI 函数调用是非常非正统的(并且仅在基于 Xamarin 的世界中广泛使用)。