java - 如何在scala repl中加载和使用 native 库?

标签 java scala scala-repl

当您使用 scala repl 时,简单调用 System.loadLibrary("opencv_410") (如果您尝试加载 libopencv_410.so)并不能让您使用 native 库。如果您尝试使用 JNI 调用创建该类的某个对象,它会告诉您 --- java.lang.UnsatisfiedLinkError,就好像没有加载库一样。

Welcome to Scala 2.12.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_201).
Type in expressions for evaluation. Or try :help.

scala> System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME)

scala> new org.opencv.core.Mat()
java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat()J
  at org.opencv.core.Mat.n_Mat(Native Method)
  at org.opencv.core.Mat.<init>(Mat.java:26)
  ... 24 elided

scala> 

提供了没有解释的解决方案。

最佳答案

要加载 native 库,您应该为类 scala.tools.nsc.interpreter.IMain 加载它。由于 Runtime 类的两个参数方法 loadLibrary0 无法从我们的范围访问,因此我们使用反射来调用它。

Welcome to Scala 2.12.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_201).
Type in expressions for evaluation. Or try :help.

scala> val loadLibrary0 = Runtime.getRuntime.getClass.getDeclaredMethods()(4)
loadLibrary0.setAccessible(true)
loadLibrary0.invoke(Runtime.getRuntime, scala.tools.nsc.interpreter.ILoop.getClass, "opencv_java410")
loadLibrary0: java.lang.reflect.Method = synchronized void java.lang.Runtime.loadLibrary0(java.lang.Class,java.lang.String)

scala> 
scala> res1: Object = null

scala> new org.opencv.core.Mat()
res2: org.opencv.core.Mat = Mat [ 0*0*CV_8UC1, isCont=false, isSubmat=false, nativeObj=0x7f5162f2a1f0, dataAddr=0x0 ]

关于java - 如何在scala repl中加载和使用 native 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56118970/

相关文章:

java - 如何在二分查找中找到数组的最后一个元素

java - cucumber 与朱尼特

scala - Scala 中的动态提取器

java - 先前操作的函数出现 NoClassDefFoundError

scala - 如何修改 REPL 中的上一行 - 与使用向上/向下箭头输入每一行相比,scala 修改输入错误以节省时间

java - 使用 TYPE_USHORT_GRAY 在java中读取黑白图像

scala - O(1) 从 mutable.Map 到 immutable.Map 的转换?

scala - Scala REPL 中的浮点文字错误

scala - Spark shell : strange behavior with import

java - TomEE 启动但 Netbeans 给出 "Failed to start"错误