Предположим, у меня есть приложение под названием 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]
}
}
Спасибо, что прочитали мой вопрос.