2

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

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

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

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

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

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

以下是一些相关的帖子(尽管与 eclipse scala ide 无关):

4

1 回答 1

2

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

这里建议使用该技术:

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

因此,如果您的 JNI 代码遵循包含静态初始化程序的约定,如下所示:

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

    native void doFoo(); 
} 

[...]

于 2012-07-02T15:13:53.753 回答