在 Scala 编译器插件中加载本机库



我正在开发一个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 无关):

  • .dll已经加载到另一个类加载器中了吗?
  • http://www.coderanch.com/t/79145/Websphere/Native-lib-already-loaded-another
  • http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4750956

IDE 在进程中使用 sbt,因此没有等效的分叉。您不能只加载一次 dll,例如将其加载到object的构造函数中吗?

此处建议使用该技术:

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

因此,如果您的 JNI 代码遵循包含静态启动器如下所示:

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

[...]

相关内容

  • 没有找到相关文章

最新更新