Как загрузить и использовать нативную библиотеку в Scala Repl? - PullRequest
0 голосов
/ 13 мая 2019

Когда вы используете scala repl, простой вызов System.loadLibrary ("opencv_410") (в случае, если вы пытаетесь загрузить libopencv_410.so) не позволяет использовать нативную библиотеку. Если вы попытаетесь создать какой-либо объект класса с помощью вызовов 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> 

Решение без объяснения причин.

1 Ответ

0 голосов
/ 13 мая 2019

Чтобы загрузить нативную библиотеку, вы должны загрузить ее для класса scala.tools.nsc.interpreter.IMain. Поскольку метод с двумя аргументами loadLibrary0 класса Runtime недоступен из нашей области видимости, мы используем рефлексию для его вызова.

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 ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...