Como posso Java WebStart várias bibliotecas, dependentes, nativos?

votos
15

Exemplo: Eu tenho dois objetos compartilhados (o mesmo se aplica a DLLs). O primeiro objeto compartilhado é a partir de uma biblioteca de terceiros, vamos chamá-lo libA.so. Eu ter envolvido algum deste com JNI e criei a minha própria biblioteca, libB.so. Agora libB depende 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 que não está no caminho da biblioteca do sistema (java.library.path não vai ajudar este). O resultado final é que libB tem uma ligação insatisfeita e não pode ser usado.

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

Publicado 07/08/2008 em 13:26
fonte usuário
Em outras línguas...                            


3 respostas

votos
6

Eu não tenho certeza se isso seria tratado exatamente da mesma forma para webstart, mas correu para esta situação de uma aplicação desktop quando se lida com um conjunto de bibliotecas nativas (DLLs no nosso caso).

Carregando Liba antes libB deve funcionar, a menos que uma dessas bibliotecas tem uma dependência que é desaparecidos e não no caminho. Meu entendimento é que uma vez que fica a uma chamada loadLibrary sistema (ou seja Java encontrou a biblioteca em sua java.library.path e agora está dizendo a OS para carregá-lo) - é completamente dependente do sistema operacional para encontrar bibliotecas dependentes , porque nesse ponto, é o sistema operacional que está carregando a biblioteca para o processo, eo sistema operacional só sabe olhar no caminho do sistema. Isso parece difícil de definir, no caso de um aplicativo Webstart, mas há uma maneira de contornar isso que não envolve a compilação estática. Você pode ser capaz de embaralhar, onde as bibliotecas são - Estou inseguro

Se você usar um carregador de classe personalizado, você pode substituir loadLibrary e findLibrary para que ele possa localizar as suas bibliotecas de dentro de um frasco no seu classpath, e se você também torná-lo consciente de suas dependências de bibliotecas nativas (ou seja libB depende Liba depende LibX, então ao carregar libB você pode se pegar e garantir que você carregar Liba primeiro lugar, e em verificar que a notificação e carregar LibX em primeiro lugar. em seguida, o sistema operacional não tentar encontrar uma biblioteca que não está em seu caminho. é klunky e um pouco doloroso , mas garantindo Java encontra-los e carrega todos eles na ordem correta pode trabalhar.

Respondeu 07/08/2008 em 18:53
fonte usuário

votos
3

compilação estática provou ser a única maneira de webstart várias bibliotecas nativas dependentes.

Respondeu 26/01/2009 em 02:47
fonte usuário

votos
1

São ambas as bibliotecas nativas embalados em um assinado jar que está listado como

<nativelib ...> 

No arquivo JNLP?

Respondeu 17/09/2008 em 07:32
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more