Невозможно связать собственные библиотеки.Джава в проекте SBT (Scala): не удалось найти файл класса - PullRequest
0 голосов
/ 04 марта 2019

Предположим, у меня есть приложение под названием vectorMul2, запрограммированное в Scala и скомпилированное с использованием SBT.Это приложение имеет класс Wrapper с нативными методами, которые должны вызываться из C ++ с использованием JNI, которые являются частью пакета myPackage.operator.Проблема в том, что javah не может найти класс-оболочку, выполняющий команду в корневом каталоге проекта (~/IdeaProjects/vectorMul2/):

javah -jni -d . -cp target/ myPackage.operator.JNIWrapper

, и я получаю следующую ошибку:

Error: Could not find class file for 'myPackage.operator.JNIWrapper'. 

Хотя есть много потоков, связанных с такого рода проблемами, все решения основаны на проекте Java, который немного отличается от проекта SBT.

Мой вопрос: как я могу генерироватьфайл заголовка (*.h), необходимый для связи библиотеки C ++ с приложением Scala с помощью JNI?

Это следующее приложение (~/IdeaProjects/vectorMul2/src/main/scala/vectorMul2.scala):

import myPackage.operator._

object Test {
  def main(args: Array[String]): Unit = {
    val a = Array(1.1f, 2.2f, 3.3f, 4.4f, 5.5f)
    val b = Array(0.1f, 0.2f, 0.3f, 0.4f, 0.5f)
    val wrapper = new JNIWrapper("arith")
    val c: Array[Float] = wrapper.mul(a, b)
    println(a.mkString(", "))
    println(b.mkString(", "))
    println(c.mkString(", "))
  }
}

Код пакета (~/IdeaProjects/vectorMul2/src/main/scala/myPackage/myPackage.scala):

package myPackage
package object operator {
  class JNIWrapper(lib: String) {
    System.loadLibrary(lib)
    @native def mul(x1: Array[Float], x2: Array[Float]): Array[Float]
  }
}

Спасибо, что прочитали мой вопрос.

...