【问题标题】:Loading a JNI library in scala在 scala 中加载 JNI 库
【发布时间】:2018-07-23 23:15:53
【问题描述】:

我正在尝试加载我正在使用的第三方库所需的 JNI 库。由于库只需要加载一次,我尝试将加载放在伴随类中。我认为这会起作用:

import com.example.Solver

object MyClass {
  System.loadLibrary("jnilibrary")
}

class MyClass {
  import MyClass._
  implicit val solver = new Solver()
}

这会在 Solver 类初始化程序 (Solver.<clinit>) 中引发 UnsatisfiedLinkError,显然是因为 JNI 库尚未加载。

将班级改为

class MyClass {
  System.loadLibrary("jnilibrary")
  implicit val solver = new Solver()
}

有效,所以我确实将库放在正确的位置。将 System.loadLibrary 移到 solver 声明之后会导致它失败,就像我尝试在伴随类中加载库时一样。

我推测它是在运行初始化程序之前尝试解析类型,所以我尝试将库加载移动到基类。我希望这意味着基类(加载库)在派生类(加载类)开始初始化之前完全初始化。

object Base {
  System.loadLibrary("jnilibrary")
}

class Base {
  import Base._
}

class MyClass extends Base {
  implicit val solver = new Solver()
}

这也失败了。

我显然可以在类中加载库,但这是多余的。它可能不会减慢速度(假设 loadLibrary 不会重新加载已加载的库),但不如我想要的干净。

有没有办法让它与伴生对象一起工作?

【问题讨论】:

  • 我猜你错过了大约 2011 年关于这个话题的令人大开眼界的讨论:scala-archive.org/…
  • 是的,我做到了。我想我专门搜索了 loadLibrary,而不是一般的静态。

标签: scala java-native-interface


【解决方案1】:

正如 Alex Cohn 指出的那样,解决方案是

class MyClass {
  MyClass
  implicit val solver = new Solver()
}

【讨论】:

    猜你喜欢
    • 2015-06-24
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2013-05-25
    • 2020-01-19
    • 2013-11-22
    相关资源
    最近更新 更多