代码之家  ›  专栏  ›  技术社区  ›  Troy Daniels

在scala中加载JNI库

  •  0
  • Troy Daniels  · 技术社区  · 6 年前

    我正在尝试加载我正在使用的第三方库所需的JNI库。由于库只需要加载一次,所以我尝试将加载放在同伴类中我想这会管用的:

    import com.example.Solver
    
    object MyClass {
      System.loadLibrary("jnilibrary")
    }
    
    class MyClass {
      import MyClass._
      implicit val solver = new Solver()
    }
    

    这会导致 UnsatisfiedLinkError 在解算器类初始值设定项中( Solver.<clinit> ),显然是因为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不会重新加载已加载的库),但不像我希望的那样干净。

    有没有办法让它和伴星一起工作?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Troy Daniels    6 年前

    正如alex cohn指出的,解决方法是

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