多模块项目中的"不满意链接错误:本机库已加载到另一个类加载器中"



我有一个使用JOCL库(http://www.jocl.org/)并具有多个模块的项目。当我跑的时候。"从命令行/activator test",或在SBT控制台运行"test"命令,我得到如下错误:

[info] Exception encountered when attempting to run a suite with class name: pl.tarsa.sortalgobox.opencl.CpuMergeSortSpec *** ABORTED ***
[info]   java.lang.UnsatisfiedLinkError: Error while loading native library "JOCL_0_1_9-linux-x86_64" with base name "JOCL_0_1_9"
[info] Operating system name: Linux
[info] Architecture         : amd64
[info] Architecture bit size: 64
[info] ---(start of nested stack traces)---
[info] Stack trace from the attempt to load the library as a file:
[info] java.lang.UnsatisfiedLinkError: no JOCL_0_1_9-linux-x86_64 in java.library.path
[info]  at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1865)
[info]  at java.lang.Runtime.loadLibrary0(Runtime.java:870)
[info]  at java.lang.System.loadLibrary(System.java:1122)
[info]  at org.jocl.LibUtils.loadLibrary(LibUtils.java:80)
[info]  at org.jocl.CL.<clinit>(CL.java:47)
[info]  at pl.tarsa.sortalgobox.opencl.common.CLContextDescription$.enumerate(CLContextDescription.scala:44)
[info]  at pl.tarsa.sortalgobox.opencl.common.CLContextsManager$.contextsDescriptions$lzycompute(CLContextsManager.scala:6)
[info]  at pl.tarsa.sortalgobox.opencl.common.CLContextsManager$.contextsDescriptions(CLContextsManager.scala:6)
[info]  at pl.tarsa.sortalgobox.opencl.common.CLContextsManager$.createCpuContext(CLContextsManager.scala:9)
[info]  at pl.tarsa.sortalgobox.opencl.common.CLContextsCache$.cpuContext$lzycompute(CLContextsCache.scala:24)
[info]  at pl.tarsa.sortalgobox.opencl.common.CLContextsCache$.cpuContext(CLContextsCache.scala:24)
[info]  at pl.tarsa.sortalgobox.opencl.common.CLContextsCache$.withCpuContext(CLContextsCache.scala:28)
[info]  at pl.tarsa.sortalgobox.opencl.common.CpuSort.sort(CpuSort.scala:34)
[info]  at pl.tarsa.sortalgobox.opencl.common.CpuSort.sort(CpuSort.scala:32)
[info]  at pl.tarsa.sortalgobox.sorts.SortChecker.forEmptyArray(SortChecker.scala:31)
[info]  at pl.tarsa.sortalgobox.opencl.CpuMergeSortSpec$$anonfun$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(CpuMergeSortSpec.scala:32)
[info]  at pl.tarsa.sortalgobox.tests.CommonUnitSpecBase.guardedOpenCLTest(CommonUnitSpecBase.scala:40)
[info]  at pl.tarsa.sortalgobox.opencl.CpuMergeSortSpec$$anonfun$1.apply$mcV$sp(CpuMergeSortSpec.scala:31)
[info]  at pl.tarsa.sortalgobox.opencl.CpuMergeSortSpec$$anonfun$1.apply(CpuMergeSortSpec.scala:31)
[info]  at pl.tarsa.sortalgobox.opencl.CpuMergeSortSpec$$anonfun$1.apply(CpuMergeSortSpec.scala:31)
[info]  at org.scalatest.Transformer$$anonfun$apply$1.apply$mcV$sp(Transformer.scala:22)
[info]  at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
[info]  at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
[info]  at org.scalatest.Transformer.apply(Transformer.scala:22)
[info]  at org.scalatest.Transformer.apply(Transformer.scala:20)
[info]  at org.scalatest.FlatSpecLike$$anon$1.apply(FlatSpecLike.scala:1647)
[info]  at org.scalamock.scalatest.AbstractMockFactory$$anonfun$withFixture$1.apply(AbstractMockFactory.scala:35)
[info]  at org.scalamock.scalatest.AbstractMockFactory$$anonfun$withFixture$1.apply(AbstractMockFactory.scala:34)
[info]  at org.scalamock.MockFactoryBase$class.withExpectations(MockFactoryBase.scala:41)
[info]  at pl.tarsa.sortalgobox.tests.CommonUnitSpecBase.withExpectations(CommonUnitSpecBase.scala:28)
[info]  at org.scalamock.scalatest.AbstractMockFactory$class.withFixture(AbstractMockFactory.scala:34)
[info]  at pl.tarsa.sortalgobox.tests.CommonUnitSpecBase.withFixture(CommonUnitSpecBase.scala:28)
[info]  at org.scalatest.FlatSpecLike$class.invokeWithFixture$1(FlatSpecLike.scala:1644)
[info]  at org.scalatest.FlatSpecLike$$anonfun$runTest$1.apply(FlatSpecLike.scala:1656)
[info]  at org.scalatest.FlatSpecLike$$anonfun$runTest$1.apply(FlatSpecLike.scala:1656)
[info]  at org.scalatest.SuperEngine.runTestImpl(Engine.scala:306)
[info]  at org.scalatest.FlatSpecLike$class.runTest(FlatSpecLike.scala:1656)
[info]  at org.scalatest.FlatSpec.runTest(FlatSpec.scala:1683)
[info]  at org.scalatest.FlatSpecLike$$anonfun$runTests$1.apply(FlatSpecLike.scala:1714)
[info]  at org.scalatest.FlatSpecLike$$anonfun$runTests$1.apply(FlatSpecLike.scala:1714)
[info]  at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:413)
[info]  at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:401)
[info]  at scala.collection.immutable.List.foreach(List.scala:381)
[info]  at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)
[info]  at org.scalatest.SuperEngine.org$scalatest$SuperEngine$$runTestsInBranch(Engine.scala:390)
[info]  at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:427)
[info]  at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:401)
[info]  at scala.collection.immutable.List.foreach(List.scala:381)
[info]  at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)
[info]  at org.scalatest.SuperEngine.org$scalatest$SuperEngine$$runTestsInBranch(Engine.scala:396)
[info]  at org.scalatest.SuperEngine.runTestsImpl(Engine.scala:483)
[info]  at org.scalatest.FlatSpecLike$class.runTests(FlatSpecLike.scala:1714)
[info]  at org.scalatest.FlatSpec.runTests(FlatSpec.scala:1683)
[info]  at org.scalatest.Suite$class.run(Suite.scala:1424)
[info]  at org.scalatest.FlatSpec.org$scalatest$FlatSpecLike$$super$run(FlatSpec.scala:1683)
[info]  at org.scalatest.FlatSpecLike$$anonfun$run$1.apply(FlatSpecLike.scala:1760)
[info]  at org.scalatest.FlatSpecLike$$anonfun$run$1.apply(FlatSpecLike.scala:1760)
[info]  at org.scalatest.SuperEngine.runImpl(Engine.scala:545)
[info]  at org.scalatest.FlatSpecLike$class.run(FlatSpecLike.scala:1760)
[info]  at org.scalatest.FlatSpec.run(FlatSpec.scala:1683)
[info]  at org.scalatest.tools.Framework.org$scalatest$tools$Framework$$runSuite(Framework.scala:462)
[info]  at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:671)
[info]  at sbt.TestRunner.runTest$1(TestFramework.scala:76)
[info]  at sbt.TestRunner.run(TestFramework.scala:85)
[info]  at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:202)
[info]  at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:202)
[info]  at sbt.TestFramework$.sbt$TestFramework$$withContextLoader(TestFramework.scala:185)
[info]  at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:202)
[info]  at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:202)
[info]  at sbt.TestFunction.apply(TestFramework.scala:207)
[info]  at sbt.Tests$$anonfun$9.apply(Tests.scala:216)
[info]  at sbt.Tests$$anonfun$9.apply(Tests.scala:216)
[info]  at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:44)
[info]  at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:44)
[info]  at sbt.std.Transform$$anon$4.work(System.scala:63)
[info]  at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
[info]  at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
[info]  at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
[info]  at sbt.Execute.work(Execute.scala:235)
[info]  at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
[info]  at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
[info]  at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
[info]  at sbt.CompletionService$$anon$2.call(CompletionService.scala:28)
[info]  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[info]  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[info]  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[info]  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[info]  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[info]  at java.lang.Thread.run(Thread.java:745)
[info] Stack trace from the attempt to load the library as a resource:
[info] java.lang.UnsatisfiedLinkError: Native Library /tmp/libJOCL_0_1_9-linux-x86_64.so already loaded in another classloader
[info]  at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1903)
[info]  at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1822)
[info]  at java.lang.Runtime.load0(Runtime.java:809)
[info]  at java.lang.System.load(System.java:1086)
[info]  at org.jocl.LibUtils.loadLibraryResource(LibUtils.java:188)
[info]  at org.jocl.LibUtils.loadLibrary(LibUtils.java:91)
[info]  at org.jocl.CL.<clinit>(CL.java:47)
[info]  at pl.tarsa.sortalgobox.opencl.common.CLContextDescription$.enumerate(CLContextDescription.scala:44)
[info]  at pl.tarsa.sortalgobox.opencl.common.CLContextsManager$.contextsDescriptions$lzycompute(CLContextsManager.scala:6)
[info]  at pl.tarsa.sortalgobox.opencl.common.CLContextsManager$.contextsDescriptions(CLContextsManager.scala:6)
[info]  at pl.tarsa.sortalgobox.opencl.common.CLContextsManager$.createCpuContext(CLContextsManager.scala:9)
[info]  at pl.tarsa.sortalgobox.opencl.common.CLContextsCache$.cpuContext$lzycompute(CLContextsCache.scala:24)
[info]  at pl.tarsa.sortalgobox.opencl.common.CLContextsCache$.cpuContext(CLContextsCache.scala:24)
[info]  at pl.tarsa.sortalgobox.opencl.common.CLContextsCache$.withCpuContext(CLContextsCache.scala:28)
[info]  at pl.tarsa.sortalgobox.opencl.common.CpuSort.sort(CpuSort.scala:34)
[info]  at pl.tarsa.sortalgobox.opencl.common.CpuSort.sort(CpuSort.scala:32)
[info]  at pl.tarsa.sortalgobox.sorts.SortChecker.forEmptyArray(SortChecker.scala:31)
[info]  at pl.tarsa.sortalgobox.opencl.CpuMergeSortSpec$$anonfun$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(CpuMergeSortSpec.scala:32)
[info]  at pl.tarsa.sortalgobox.tests.CommonUnitSpecBase.guardedOpenCLTest(CommonUnitSpecBase.scala:40)
[info]  at pl.tarsa.sortalgobox.opencl.CpuMergeSortSpec$$anonfun$1.apply$mcV$sp(CpuMergeSortSpec.scala:31)
[info]  at pl.tarsa.sortalgobox.opencl.CpuMergeSortSpec$$anonfun$1.apply(CpuMergeSortSpec.scala:31)
[info]  at pl.tarsa.sortalgobox.opencl.CpuMergeSortSpec$$anonfun$1.apply(CpuMergeSortSpec.scala:31)
[info]  at org.scalatest.Transformer$$anonfun$apply$1.apply$mcV$sp(Transformer.scala:22)
[info]  at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
[info]  at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
[info]  at org.scalatest.Transformer.apply(Transformer.scala:22)
[info]  at org.scalatest.Transformer.apply(Transformer.scala:20)
[info]  at org.scalatest.FlatSpecLike$$anon$1.apply(FlatSpecLike.scala:1647)
[info]  at org.scalamock.scalatest.AbstractMockFactory$$anonfun$withFixture$1.apply(AbstractMockFactory.scala:35)
[info]  at org.scalamock.scalatest.AbstractMockFactory$$anonfun$withFixture$1.apply(AbstractMockFactory.scala:34)
[info]  at org.scalamock.MockFactoryBase$class.withExpectations(MockFactoryBase.scala:41)
[info]  at pl.tarsa.sortalgobox.tests.CommonUnitSpecBase.withExpectations(CommonUnitSpecBase.scala:28)
[info]  at org.scalamock.scalatest.AbstractMockFactory$class.withFixture(AbstractMockFactory.scala:34)
[info]  at pl.tarsa.sortalgobox.tests.CommonUnitSpecBase.withFixture(CommonUnitSpecBase.scala:28)
[info]  at org.scalatest.FlatSpecLike$class.invokeWithFixture$1(FlatSpecLike.scala:1644)
[info]  at org.scalatest.FlatSpecLike$$anonfun$runTest$1.apply(FlatSpecLike.scala:1656)
[info]  at org.scalatest.FlatSpecLike$$anonfun$runTest$1.apply(FlatSpecLike.scala:1656)
[info]  at org.scalatest.SuperEngine.runTestImpl(Engine.scala:306)
[info]  at org.scalatest.FlatSpecLike$class.runTest(FlatSpecLike.scala:1656)
[info]  at org.scalatest.FlatSpec.runTest(FlatSpec.scala:1683)
[info]  at org.scalatest.FlatSpecLike$$anonfun$runTests$1.apply(FlatSpecLike.scala:1714)
[info]  at org.scalatest.FlatSpecLike$$anonfun$runTests$1.apply(FlatSpecLike.scala:1714)
[info]  at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:413)
[info]  at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:401)
[info]  at scala.collection.immutable.List.foreach(List.scala:381)
[info]  at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)
[info]  at org.scalatest.SuperEngine.org$scalatest$SuperEngine$$runTestsInBranch(Engine.scala:390)
[info]  at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:427)
[info]  at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:401)
[info]  at scala.collection.immutable.List.foreach(List.scala:381)
[info]  at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)
[info]  at org.scalatest.SuperEngine.org$scalatest$SuperEngine$$runTestsInBranch(Engine.scala:396)
[info]  at org.scalatest.SuperEngine.runTestsImpl(Engine.scala:483)
[info]  at org.scalatest.FlatSpecLike$class.runTests(FlatSpecLike.scala:1714)
[info]  at org.scalatest.FlatSpec.runTests(FlatSpec.scala:1683)
[info]  at org.scalatest.Suite$class.run(Suite.scala:1424)
[info]  at org.scalatest.FlatSpec.org$scalatest$FlatSpecLike$$super$run(FlatSpec.scala:1683)
[info]  at org.scalatest.FlatSpecLike$$anonfun$run$1.apply(FlatSpecLike.scala:1760)
[info]  at org.scalatest.FlatSpecLike$$anonfun$run$1.apply(FlatSpecLike.scala:1760)
[info]  at org.scalatest.SuperEngine.runImpl(Engine.scala:545)
[info]  at org.scalatest.FlatSpecLike$class.run(FlatSpecLike.scala:1760)
[info]  at org.scalatest.FlatSpec.run(FlatSpec.scala:1683)
[info]  at org.scalatest.tools.Framework.org$scalatest$tools$Framework$$runSuite(Framework.scala:462)
[info]  at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:671)
[info]  at sbt.TestRunner.runTest$1(TestFramework.scala:76)
[info]  at sbt.TestRunner.run(TestFramework.scala:85)
[info]  at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:202)
[info]  at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:202)
[info]  at sbt.TestFramework$.sbt$TestFramework$$withContextLoader(TestFramework.scala:185)
[info]  at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:202)
[info]  at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:202)
[info]  at sbt.TestFunction.apply(TestFramework.scala:207)
[info]  at sbt.Tests$$anonfun$9.apply(Tests.scala:216)
[info]  at sbt.Tests$$anonfun$9.apply(Tests.scala:216)
[info]  at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:44)
[info]  at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:44)
[info]  at sbt.std.Transform$$anon$4.work(System.scala:63)
[info]  at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
[info]  at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226)
[info]  at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
[info]  at sbt.Execute.work(Execute.scala:235)
[info]  at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
[info]  at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226)
[info]  at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
[info]  at sbt.CompletionService$$anon$2.call(CompletionService.scala:28)
[info]  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[info]  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[info]  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[info]  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[info]  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[info]  at java.lang.Thread.run(Thread.java:745)
[info] ---(end of nested stack traces)---
[info]   at org.jocl.LibUtils.loadLibrary(LibUtils.java:122)
[info]   at org.jocl.CL.<clinit>(CL.java:47)
[info]   at pl.tarsa.sortalgobox.opencl.common.CLContextDescription$.enumerate(CLContextDescription.scala:44)
[info]   at pl.tarsa.sortalgobox.opencl.common.CLContextsManager$.contextsDescriptions$lzycompute(CLContextsManager.scala:6)
[info]   at pl.tarsa.sortalgobox.opencl.common.CLContextsManager$.contextsDescriptions(CLContextsManager.scala:6)
[info]   at pl.tarsa.sortalgobox.opencl.common.CLContextsManager$.createCpuContext(CLContextsManager.scala:9)
[info]   at pl.tarsa.sortalgobox.opencl.common.CLContextsCache$.cpuContext$lzycompute(CLContextsCache.scala:24)
[info]   at pl.tarsa.sortalgobox.opencl.common.CLContextsCache$.cpuContext(CLContextsCache.scala:24)
[info]   at pl.tarsa.sortalgobox.opencl.common.CLContextsCache$.withCpuContext(CLContextsCache.scala:28)
[info]   at pl.tarsa.sortalgobox.opencl.common.CpuSort.sort(CpuSort.scala:34)

根据JOCL,这些错误不会出现在第一个模块/子项目中的测试中。当我这样做的时候。"/activator test",那么OpenCL测试从一些(第一次测试)模块工作,而所有其他不。当我这样做的时候。/activator"生成SBT控制台,然后运行"测试"多次,然后第一次它的行为像普通"。/activator test",但在下次测试运行时,所有OpenCL测试都失败,并出现UnsatisfiedLinkError。

这是我的构建文件:https://github.com/tarsa/SortAlgoBox/blob/4a041d93beb572a6dcce100780bc675d46d814f3/project/MainBuild.scala

根据这个答案:https://stackoverflow.com/a/23157190/492749 SBT使用一些神奇的类加载器,并为每个这样的类加载器重命名本机库。问题是,JOCL在加载某些Java类时解包本机库,结果文件名和位置总是相同的。换句话说:SBT的魔法不能很好地与JOCL的魔法配合。

你的解决方案是什么?

PS:在IntelliJ IDEA中执行测试可以很好地工作-可能IDEA没有使用类加载器魔法

根据这个答案:https://stackoverflow.com/a/23157190/492749 SBT使用一些神奇的类加载器,并为每个这样的类加载器重命名本机库。问题是,JOCL在加载某些Java类时解包本机库,结果文件名和位置总是相同的。换句话说:SBT的魔法不能很好地与JOCL的魔法配合。

这对我来说不是自动发生的;我认为它只在加载SBT插件时使用。我不得不调整SBT类加载器:

// adapted from sbt.classpath.NativeCopyLoader
package scalan.compilation.lms
import java.io.File
import java.net.{URLClassLoader, URL}
import java.nio.file.Files
/**
 * Loads native libraries from a temporary location in order to work around the jvm native library uniqueness restriction.
 *
 * The loader will provide native libraries listed in `explicitLibraries` and on `searchPaths` by copying them to `tempDirectory`.
 */
class NativeCopyLoader(explicitLibraries: Seq[File], searchPaths: Seq[File], urls: Array[URL], parent: ClassLoader) extends URLClassLoader(urls, parent) {
  private[this] val mapped = new collection.mutable.HashMap[String, String]
  private[this] val tempDirectory = Files.createTempDirectory("native-library-copies").toFile
  tempDirectory.deleteOnExit()
  override protected def findLibrary(name: String): String =
    synchronized { mapped.getOrElseUpdate(name, findLibrary0(name)) }
  private[this] def findLibrary0(name: String): String = {
    val mappedName = System.mapLibraryName(name)
    val explicit = explicitLibraries.filter(_.getName == mappedName).toStream
    val search = searchPaths.toStream flatMap relativeLibrary(mappedName)
    (explicit ++ search).headOption.map(copy).orNull
  }
  private[this] def relativeLibrary(mappedName: String)(base: File): Seq[File] = {
    val f = new File(base, mappedName)
    if (f.isFile) f :: Nil else Nil
  }
  private[this] def copy(f: File): String = {
    val target = new File(tempDirectory, f.getName)
    Files.copy(f.toPath, target.toPath)
    target.getAbsolutePath
  }
}

然后确保在加载加载本机库的类时使用它。但是,这可能需要修改才能使用JOCL魔法。

相关内容

最新更新