Java, System.LoadLibrary ("Somedllfile") recebe erro de link não relatisizado
-
06-07-2019 - |
Pergunta
Eu escrevi alguns ligações JNI em uma biblioteca C ++ e criei alguns arquivos DLL para o meu projeto de servidor Java. Digamos que os arquivos DLL e JAR estejam na mesma pasta em "C:/servidor"
Estou acessando esses arquivos DLL usando:
System.loadLibrary("someDLLFile");
Na classe que precisa do código C ++.
O problema que estou enfrentando é quando executo este servidor em minha própria máquina, tudo funciona bem, independentemente de onde eu coloco a pasta "servidor". Mas quando eu dou a um colega para testar, eles recebem continuamente:
java.lang.UnsatisfiedLinkError no someDLLFile in java.library.path
Quero ter os arquivos DLL ao vivo na mesma pasta que os arquivos JAR e preferem não ter alguém para configurar sua variável de caminho.
Por que o System.loadLibrary () funciona em minha própria máquina, independentemente da localização da pasta, mas não em outro computador?
Solução
Funciona porque a DLL (ou uma DLL depende, ou seja, msvcr90.dll ou algo assim) estão no caminho da sua máquina, mas não no outro.
Defina o caminho Env-Var ou a propriedade Java.library.path para conter o diretor com seu arquivo ou armazenar sua DLL onde Java o encontra por padrão (muitas opções aqui, dependendo da estratégia e da plataforma de implantação).
Outras dicas
Uma opção é especificar o diretório na linha de comando quando você iniciar a VM:
java -classpath C:\server -Djava.library.path=C:\server somePackage.Main
Outra opção é usar System.load
ao invés de System.loadLibrary
.
URL url = Test.class.getResource("someDLLFile.dll");
String f = new File(url.getFile()).getAbsolutePath();
System.load(f);
A desvantagem é que seu programa agora está lidando com nomes de diretórios dependentes da plataforma, extensões de arquivos etc.
Não tenho certeza se isso é útil ou não, mas incluí o seguinte em alguns projetos:
http://forums.sun.com/thread.jspa?threadid=707176
Para carregar bibliotecas nativas.
E então eu apenas carrego o diretório de bin
String binPath = new File(".").getAbsolutePath()
+ System.getProperty("file.separator") + "bin";
addDir( binPath );
Funciona muito bem.
Mas, novamente, não tenho certeza se esse é o caso ou não.
Tente baixar depende.exe para ver se a DLL depende de outras DLLs do sistema ou não. Se isso acontecer, verifique a outra máquina, se essas DLLs estão presentes ou não no caminho.