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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top