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

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á…

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

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…

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…

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:

Olá

[quote=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…
[/quote]

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

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…

Olá

[quote=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…[/quote]

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

[]s
Luca

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…

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

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

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

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?