【问题标题】:Loading Native library in Scala Compiler Plugin在 Scala 编译器插件中加载本机库
【发布时间】:2012-07-02 12:19:51
【问题描述】:

我正在开发一个 scala 编译器插件。编译器插件在“refcheck”阶段之后运行。它分析了 AST(抽象语法树) 并产生一些输出。在这个插件中,我正在使用 System.loadLibrary 加载本机库“scalaz3.dll”

我计划在 Eclipse Scala IDE 中使用编译器插件。我在 ScalaIde 首选项中设置了-XPlugin 参数。 当我在 Eclipse 中编译 scala 源文件时,该插件在 refchecks 阶段之后被调用并且工作正常(生成所需的输出)

但是,当我对源文件进行更改并编译时,出现以下错误。

The SBT builder crashed while compiling your project. 
Native Library scalaz3.dll already loaded in another classloader.

看起来 ScalaIDE 生成了另一个类加载器并尝试在同一进程中加载​​插件类。

我在编译器插件测试用例中遇到了同样的问题。但是,我在build.sbt 中使用fork in Test := true 修复了它。 但我对如何在 eclipse scala IDE 中修复它一无所知。

这里有一些相关的帖子(虽然与 eclipse scala ide 无关):

【问题讨论】:

    标签: scala dll eclipse-plugin scala-ide scalac


    【解决方案1】:

    IDE 使用 sbt in-process,因此不存在分叉的等价物。难道你不能只加载 dll 一次,例如通过在 object 的构造函数中加载它?

    技术建议here:

    调用System.loadLibrary(String)的类必须由一个 不受重新加载 Web 应用程序影响的类加载器 自己。

    因此,如果您的 JNI 代码遵循包含 像这样的静态初始化器:

    class FooWrapper {
        static {
            System.loadLibrary("foo");
        }
    
        native void doFoo(); 
    } 
    

    [...]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多