falha ao carregar uma biblioteca nativa usando o ativador (Play Framework)
Estou tentando carregar uma biblioteca nativa no meu aplicativo Play 2.4.x. Eu escrevi um teste simples que funciona bem no IDE (IntelliJ) e no SBT. Nos dois casos, estou configurando ojava.library.path
para executar os testes.
No IDE, defino-Djava.library.path=$USER_HOME$/dev/lindoapi/bin/linux64
na configuração de execução de teste.
De acordo com a documentação sbt, meubuild.sbt
está bifurcando a JVM e configurando ojava.library.path
.
javaOptions += "-Djava.library.path=/home/aczerwon/dev/lindoapi/bin/linux64"
fork := true
O teste a seguir passa muito bem no IDE e noactivator test
.
class LindoApiSpec extends Specification {
System.loadLibrary("lindojni")
"The Lindo API" should {
"have a valid license" in {
val lindo = new LindoEnvironment()
lindo.apiVerion() must beSuccessfulTry.withValue("LINDO API Version 9.0.2120.225")
}
}
Quando estou fora do contexto de teste, carrego a biblioteca nativa no ciclo de vida de inicialização do Play.
object Global extends GlobalSettings {
override def beforeStart(app: Application) = {
System.loadLibrary("lindojni")
}
}
Quando eu chamo o mesmo método do webapi (activator ~run
), Estou recebendo umUnsatisfiedLinkError
erro.
1) Error injecting constructor, java.lang.UnsatisfiedLinkError: no lindojni in java.library.path
at play.api.GlobalPlugin.<init>(GlobalSettings.scala:262)
at play.api.GlobalPlugin.class(GlobalSettings.scala:262)
while locating play.api.GlobalPlugin
A API da Web fica assim:
class OptimizationApi extends Controller {
def version() = Action {
val lindo = new LindoEnvironment()
lindo.apiVerion() match {
case Success(version) => Ok(version)
case Failure(e) => BadRequest(e.getMessage)
}
}
}
Eu assumi que meu build.sbt iria bifurcar a JVM e definir ojava.library.path
paraambos test
e run
contextos. Alguma pista do que estou fazendo de errado?
Nova informação
Quando eu começoactivator -Djava.library.path=$USER_HOME$/dev/lindoapi/bin/linux64
ou defina JAVA_OPTS, a chamada paraSystem.loadLibrary(...)
no ciclo de vida da inicialização passa. Eu ainda recebo oUnsatisfiedLinkError
, mas acontece mais tarde quando faço uma chamada para a biblioteca nativa via JNI. Muito estranho.