【问题标题】:scala native vs. JNIscala native 与 JNI
【发布时间】:2018-03-01 17:12:11
【问题描述】:

我正在将原生 API 提升到 Scala。似乎有两条路径:使用 JNI 或使用 Scala Native。

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

随之而来的是 Scala native,它在 Scala 中执行相反的操作并隐藏 C 函数。优点:你不用 C 语言编写,所以没有新的本地库,也没有双重包装。缺点:您似乎只能提升 Scala 原生原语,因此无法访问复杂的原生数据结构。如果原生库不能使用它的数据结构,它就会变得毫无用处。

正如预期的那样,两者都不是非常便携,但是有一些我忽略的功能可以解决这些方法中的一种或两种方法的缺点吗?还是有其他理由选择原生 Scala 而不是 JNI?

【问题讨论】:

    标签: scala java-native-interface


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 2018-07-14
      • 2023-04-02
      相关资源
      最近更新 更多