【发布时间】: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