(Java Web Star || Applet) && (Bibliotecas nativas)

12 respostas
J

Estou desenvolvendo uma aplicação em Java que manipula arquivos multimídia…Tentei utilizar o JMF, mas não obtive resultados positivos para os meus objetivos. Assim, optei por utilizar o JVLC, um binding para o VLC player (implementado em C++) em Java:
http://trac.videolan.org/jvlc/

Localmente funciona perfeitamente. Se eu fizesse uma aplicação desktop, distribuiria o jar e colocaria as dll´s na mesma pasta da aplicação. Tudo funcionaria perfeitamente. Todavia, minha aplicação deve ser acessível através de um portal. Assim, preciso distribuir a aplicação via Applet ou JWS.

Eu havia desenvolvido um mecanismo que, quando a aplicação é inicializada, ela verifica se consegue acessar as bibliotecas em uma das pastas listadas na propriedade “java.library.path”. Se as bibliotecas não estão instaladas, minha aplicação faz o download delas do meu servidor e instala em uma destas pastas (java.library.path). O problema é que isso só funciona até o Windows XP…No linux e no Windows Vista minha aplicação não tem permissão para acessar essas pastas de programas…Só consigo acessar pastas de usuários. Assim, meu download e instalação ficam impossibilitados…

1-Distribuição via JWS:
Descobri uma aplicação que utiliza o JVLC também e é distribuída via JWS:
http://www.myuniportal.com/download.php

Quando esta aplicação é “instalada” ela faz o download de um jar com todas as dll´s necessárias par ao fucionamento. Quando ela é inicializada, verifiquei na pasta “…\Sun\Java\Deployment\cache\6.0” e descobri que, de alguma forma a aplicação extrai essas dll´s do jar e as coloca em uma pasta dentro desse contexto de pastas…A pasta que tem o Jar que encapsula as dll´s e que abriga as dll´s desencapsuladas é “…\Sun\Java\Deployment\cache\6.0\47”, caso alguém queria baixar a aplicação para dar uma olhada no que estou dizendo. Nesta pasta tem um jar de 10,3 MB. É ele quem encapsula as dll´s…A aplicação fucniona perfeitamente. O arquivo jnlp dela é o seguinte:

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+"
  codebase="http://www.myuniportal.com/MyUniPortal/" href="http://www.myuniportal.com/MyUniPortal/MyUniPortal.jnlp">
<information>
  <title>MyUniPortal</title>
  <vendor>MyUniPortal</vendor>
  <homepage href="http://www.myuniportal.com"/>
  <description>MyUniportal Application</description>
<icon href="myuniportalicon.jpg"/> 
<icon kind="splash" href="myuniportal.jpg"/> 
  <shortcut online="true">
    <desktop/> 
    <menu/>  
  </shortcut>
  <offline-allowed/>
</information>
<security>
  <all-permissions/>
</security>
<update check="timeout" policy="always"/>
<resources os="Windows">
  <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se" java-vm-args="-Xms128m -Xmx128m -XX:NewSize=96m -XX:MaxNewSize=96m " />
<jar href="main.jar.pack.gz" main="true"/>
  <jar href="eConcertUser.jar.pack.gz"/>
  <jar href="MyAdmin.jar.pack.gz"/>
  <jar href="MyMail.jar.pack.gz"/>
  <jar href="MyMaps.jar.pack.gz"/>
  <jar href="MyOffice.jar.pack.gz"/>
  <jar href="MyImages.jar.pack.gz"/>
  <jar href="MyColab.jar.pack.gz"/>
  <jar href="MyVideo.jar.pack.gz"/>
  <jar href="MyTeach.jar.pack.gz"/>
  <jar href="MyLib.jar.pack.gz"/>
  <jar href="MySearch.jar.pack.gz"/>
  <jar href="MyComms.jar.pack.gz"/>
  <jar href="lib/activation.jar.pack.gz"/>
  <jar href="lib/ssce.jar.pack.gz"/>
  <jar href="lib/jmf2.1.1.e.jar.pack.gz"/>
  <jar href="lib/customizer.jar.pack.gz"/>
  <jar href="lib/mediaplayer.jar.pack.gz"/>
  <jar href="lib/multiplayer.jar.pack.gz"/>
  <jar href="lib/sound.jar.pack.gz"/>
  <jar href="lib/MyUniPortal-WebServiceClient.jar.pack.gz"/>
  <jar href="lib/yahoo_search-2.0.0.jar.pack.gz"/>
 <jar href="lib/synthetica.jar.pack.gz"/>
  <jar href="lib/syntheticaBlackMoon.jar.pack.gz"/>
  <jar href="lib/syntheticaBlackStar.jar.pack.gz"/>
  <jar href="lib/syntheticaBlueIce.jar.pack.gz"/>
  <jar href="lib/syntheticaBlueMoon.jar.pack.gz"/>
  <jar href="lib/syntheticaBlueSteel.jar.pack.gz"/>
  <jar href="lib/syntheticaGreenDream.jar.pack.gz"/>
  <jar href="lib/syntheticaOrangeMetallic.jar.pack.gz"/>
  <jar href="lib/syntheticaMauveMetallic.jar.pack.gz"/>
  <jar href="lib/syntheticaSilverMoon.jar.pack.gz"/>
  <jar href="lib/syntheticaSkyMetallic.jar.pack.gz"/>
  <jar href="lib/syntheticaWhiteVision.jar.pack.gz"/>
  <jar href="lib/swingx-lite.jar.pack.gz"/>
  <jar href="lib/jep-2.3.1.jar.pack.gz"/>
  <jar href="lib/jfreechart-1.0.9.jar.pack.gz"/>
  <jar href="lib/jcommon-1.0.12.jar.pack.gz"/>
  <jar href="lib/DJNativeSwing.jar.pack.gz"/>
  <jar href="lib/jna.jar.pack.gz"/>
  <jar href="lib/jna_WindowUtils.jar.pack.gz"/>
  <jar href="lib/jogl.jar.pack.gz"/>
  <jar href="lib/gluegen-rt.jar.pack.gz"/>
  <jar href="lib/JDICplus.jar.pack.gz"/>
  <extension name="worldwind" href="http://www.myuniportal.com/MyUniPortal/worldwind.jnlp" name="worldwind"/>
  <nativelib href="lib/windows/x86/JDICplus_native.jar"/>
  <nativelib href="jmf-native.jar"/>
  <nativelib href="jogl-native.jar"/>
  <nativelib href="jvlc-native.jar"/>
</resources>
<application-desc main-class="MyUniPortal" > 
  <argument>mup_userid=student</argument> 
  <argument>mup_password=student</argument> 
</application-desc> 
</jnlp>

Gostaria de saber se alguém sabe como posso fazer algo semelhante na minha aplicação…

2-Distribuição via Applet
Via applet existe alguma forma viável de colocar essas bibliotecas em seu devido lugar para todos os SO´s? Não que eu procure uma panacéia, mas pelo menso uma forma viável para cada SO.

Agradeço desde já…

12 Respostas

Luca

Olá

Leia ao menos os 2 tópicos aqui do GUJ:

http://www.guj.com.br/posts/list/109056.java

http://www.guj.com.br/posts/list/92423.java

[]s
Luca

J

Eu já li e até entrei em contato com o dono daqueles tópicos…
Mas não consegui entender como posso fazer isso via JWS como a aplicação que indiquei faz…

E

Olha só que irônico…Este tópico me chamou atenção porque poderia conter a solução para os meus problemas. Entro nele e a solução indicada foram dois tópicos meus, hehehe…

Eu ainda estou patinando nessa questão de distribuir o software via applet ou jws…

E

Eu cheguei a testar este software que você indicou, o MyUniPortal, mas não havia reparado em como ele utiliza as bibliotecas nativas…
Realmente, parece que ele as desempacota do jar em uma pasta sobre a qual o mecanismo JWS tem controle…Mas não sei se isso foi programado ou é feito automaticamente pelo mecanismo jws…

Se alguém pudesse dar uma mão nisso, acho que meus problemas seriam resolvidos :wink:

Luca

Olá

eclipso:
Olha só que irônico…Este tópico me chamou atenção porque poderia conter a solução para os meus problemas. Entro nele e a solução indicada foram dois tópicos meus, hehehe…

Eu ainda estou patinando nessa questão de distribuir o software via applet ou jws…

A solução que lhe passei foi usada no Banco Postal para instalar bibliotecas nativas em milhares de agências dos Correios. Não sei porque não serviria em um outro caso similar.

[]s
luca

E

Desculpe Luca…Não quiz insinuar que a solução que indicaste não funciona…O problema é que eu não consegui fazer funcionar ainda :wink:

Mas estou numas do Java Web Start…Parece que ele faz todo um controle próprio que faculta a distribuição dessas bibliotecas nativas…Só ainda não entendi como funciona…

Luca

Olá

eclipso:
Desculpe Luca…Não quiz insinuar que a solução que indicaste não funciona…O problema é que eu não consegui fazer funcionar ainda :wink:

Mas estou numas do Java Web Start…Parece que ele faz todo um controle próprio que faculta a distribuição dessas bibliotecas nativas…Só ainda não entendi como funciona…

Faz como falei. Crie um aplicativo adicional só para fazer a instalação das bibliotecas nativas. Um programa instalador.

[]s
Luca

E

Olá Luca…

Certo…Eu aderi àquela sua idéia na época, até porque eu já estava implementando algo do gênero…

Todavia essa idéia da applet que baixa as bibliotecas e as copia para uma das pastas listadas por “java.library.path” só funciona em SO´s que não protegem as pastas de sistema…O que se resume, até onde eu sei, aos Windows até o XP, o Vista já bloqueia…Minha aplicação estava funcionando muito bem no XP. Verificava se as bibliotecas necessárias estavam disponíveis, se não estavam, as baixava para a pasta adequada e saía funcionando perfeitamente…Quando rodei minha aplicação no Vista, este mecanismo parou de funcionar porque ele não permite ese tipo de coisa…No Linux é pior ainda.

Eu até gostaria de deixar a minha aplicação em formato applet, mas precisaria criar esses instaladores à parte, e isso eu ainda não entendi direito como posso fazer. Minha idéia seria criar um .exe para Windows que, a partir de um duplo clique, instalasse essas bibliotecas pra mim. No caso do Vista, abriria aquela janela pedindo se o usuário permite a instalação ou não, mas isso não seria problema…Tendo este instalador, o usuário teria que baixá-lo e executá-lo antes de utilizar a ferramenta…Ele seria um pré-requisito…
Alguém saberia como posso criar esse software instalador for Windows? Existem soluções prontas?

No caso do Linux, o peczenyj recomendou a utilização de um shell script que instalasse tudo a partir de um tar.gz…Meus conhecimentos de Linux são um tanto rudimentares para entender perfeitamente esta idéia. Se alguém pudesse me indicar uma referência para começar a implementar essas coisas, tenho certeza que resolveria tudo facilmente…

Obrigado pela atenção…

Luca

Olá

Se não estou enganado porque fazem muitos anos, no meu caso as bibliotecas nativas eram copiadas para a pasta ext do JRE.

[]s
Luca

E

Pois é…No vista esta pasta é protegida…Por isso estou tendo que buscar outras alternativas…

Luca

Olá

Mas porque?

No meu caso a gente também fazia a instalação do JRE ( o Banco Postal era um fornecimento completo, máquina + software) e o JRE ficava onde a gente escolhia na hora da instalação. Será que no seu caso não dá para fazer um manual de instalação do JRE?

[]s
Luca

E

Bem…Na minha máquina, rodando Vista (apenas para testes, hehe), se tentar fazer download para o diretório de extensão, dá o seguinte erro:

java.io.FileNotFoundException: C:\Program Files\Java\jdk1.6.0_05\jre\lib\ext\avcodec-51.dll (Access is denied)
        at java.io.FileOutputStream.open(Native Method)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
        at componentePlayer.InstaladorDeBibliotecasNativas.installaArquivo(InstaladorDeBibliotecasNativas.java:158)
        at componentePlayer.InstaladorDeBibliotecasNativas.instalaBibliotecas(InstaladorDeBibliotecasNativas.java:89)
        at componentePlayer.JanelaTestaComponentePlayer.<init>(JanelaTestaComponentePlayer.java:45)
        at componentePlayer.JanelaTestaComponentePlayer$2.run(JanelaTestaComponentePlayer.java:102)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Será que tirando o JRE da hierarquia “C:\Program Files” é o bastante para que o Vista libere a pasta? Em caso positivo, não é um tanto bizarro obrigar meu usuário a escolher locais fora desta hierarquia para instalar o JRE?

Criado 8 de dezembro de 2008
Ultima resposta 11 de dez. de 2008
Respostas 12
Participantes 3