在Scala中加载JNI库

时间:2018-07-20 18:12:29

标签: scala java-native-interface

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

<body>
  <div class="bar flex">
  	<div class="bar fill" style="width: 75%">
    	<div class="tag">Javascript</div>
    </div>
    <span class="value">75%</span>
  </div> 

</body>

这显然在Solver类初始化程序(import com.example.Solver object MyClass { System.loadLibrary("jnilibrary") } class MyClass { import MyClass._ implicit val solver = new Solver() } 中引发了UnsatisfiedLinkError,显然是因为尚未加载JNI库。

将课程更改为

Solver.<clinit>

有效,所以我确实将库放在正确的位置。将class MyClass { System.loadLibrary("jnilibrary") implicit val solver = new Solver() } 移到System.loadLibrary声明之后会导致它以与尝试在伴随类中加载库相同的方式失败。

我认为在运行初始化程序之前它试图解析类型,因此我尝试将库加载移至基类。我希望这意味着基类(装入库)在派生类(装入类)开始初始化之前已完全初始化。

solver

这也失败。

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

是否有办法使它与伴随对象一起工作?

1 个答案:

答案 0 :(得分:0)

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

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