Pergunta

Exemplo:Eu tenho dois objetos compartilhados (o mesmo deve ser aplicado .dlls).O primeiro objeto compartilhado é a partir de uma biblioteca de terceiros, nós vamos chamá-lo de libA.então.Eu tenho enrolado alguns deste com JNI e criei minha própria biblioteca, libB.então.Agora libB depende da libA.

Quando webstarting, ambas as bibliotecas são lugares em alguns webstart área de trabalho.Meu código java tenta carregar libB.Neste ponto, o carregador do sistema tentará carregar libA, o que não é o sistema de caminho de biblioteca (java.a biblioteca.o caminho não vai ajudar este).O resultado final é que libB tem um insatisfeito link e não pode ser usado.

Eu tentei carregar libA antes de libB, mas que ainda não funciona.Parece que SO quer fazer o carregamento para mim.Existe alguma maneira eu posso fazer este trabalho que compilar estaticamente?

Foi útil?

Solução 2

Estática compilação provou ser a única forma de webstart dependentes múltiplas bibliotecas nativas.

Outras dicas

Eu não tenho certeza se isso seria tratada exatamente da mesma maneira webstart, mas corremos para esta situação em uma aplicação de ambiente de trabalho quando se lida com um conjunto de bibliotecas nativas (dlls no nosso caso).

Carregamento libA antes de libB deve funcionar, a menos que uma dessas bibliotecas tem uma dependência que é omitido, e não no caminho.O meu entendimento é de que, uma vez que é um sistema de chamada loadLibrary (i.e.Java tem encontrado a biblioteca em seu java.a biblioteca.caminho e agora está dizendo que o sistema operacional para carregá-lo) - é completamente dependente do sistema operacional para localizar qualquer dependente bibliotecas, porque naquele momento ele é o sistema operativo que está a carregar a biblioteca para o processo, e o sistema operacional só sabe olhar no caminho do sistema.O que parece difícil de definir, no caso de uma 'Webstart' app, mas há uma maneira de contornar isso, que não envolvem a compilação estática.Você pode ser capaz de embaralhar onde as bibliotecas são - eu tenho certeza

Se você usar um carregador de classe personalizada, você pode substituir loadLibrary e findLibrary para que ele possa localizar as suas bibliotecas de dentro de um jar no classpath, e se você também torná-lo ciente de seu nativo dependências de bibliotecas (i.e.libB depende libA depende libX, em seguida, quando o carregamento libB você pode pegar e garantir que você carregar libA primeiro, e na verificação de que o pré-aviso e de carga libX primeiro.Em seguida, o sistema operacional não tentar encontrar uma biblioteca que não está em seu caminho.É klunky e um pouco doloroso, mas a garantia de Java encontra-los e carrega-las na ordem correta pode trabalhar.

Ambos são nativos bibliotecas compactadas em um assinado jar que é listado como

<nativelib ...> 

No arquivo JNLP?

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