Problemas com .JAR + .DLL (Agora com arquivo de teste )[RESOLVIDO]

26 respostas
B

Pessoal,
Estou criando um .JAR da minha aplicação, mas acontece que uma das bibliotecas que uso, utiliza uma DLL que tenho que colocar no /System32.

Acontece que ao tentar executar meu programa pelo .JAR ele da o erro exatamente em uma das funções que utiliza a .DLL.
Tem algum modo de gerar o .JAR com a .DLL??

Meu arquivo Manifest:
Citação:

Uma tentativa para ver se ele incluia o path da DLL

Citação:

Mas nenhum funcionou…Algué sabe como posso fazer nesse caso…

26 Respostas

A

Eu vi algo parecido no core java, acredito que na versão avançada, de uma olhada, acredito que vai ter o que vc procura.

F

Qual é o erro ?

T
Manifest-Version: 1.0
Main-Class: registro.Main
Name: registro\Main.class
Java-Bean: True
Class-Path: c:/Arquivos de Programas/Java/LatteLib/lattelib/lib/LatteLibWin-3.0.0.jar

Dois problemas aqui.

  1. Acho que você não pode usar “” em nomes de arquivos e classes, e mesmo no “Name” não é bom pôr isso.
  2. Espaços em nomes de arquivo nunca foram boa coisa. Experimente copiar o LatteLibWin-3.0.0.jar para um diretório sem espaços, e talvez tirar a letra do drive (não sei se “:” também não é bom de usar)
Manifest-Version: 1.0
Main-Class: registro.Main
Name: Main
Java-Bean: true
Class-Path: /LatteLibWin-3.0.0.jar
B

O erro não encontra o

lattelib.win.WindowsException

Que é o método que usa a DLL para funcionar…

F

Ele não encontra o método. A DLL ele consegue encontrar e carregar?

Pode ser que o nome do método native da sua classe esta diferente da que está dentro da DLL.

B

Acontece que eu consigo executar pelo Netbeans…
E para ver se o problema era com o carregamento da DLL, eu tirei a DLL do windows/System32, e tetei rodar pelo NetBeans, ai que eu tive certeza, pois o erro foi o mesmo que estava dando no .JAR.

B

Eu acho isso um grande problema…pois tenho uma aplicação pronta que não posso distribuir, pq não hà a possibilidade de o .JAR (Executavel padrão do Java) localiza uma DLL…
E essa DLL nem é minha, faz parte de uma API que usei.
Procurei em tudo que forum e até agora parece que esse problema não tem solução…

A

Eu passei por algo similar aqui no trabalho… a solução que eu encontrei foi tentar encontrar a .DLL no windows\system32 se eu não encontrar eu baixo do meu servidor e gravo lá… mais a minha aplicação [APPLET] roda na intranet.

B

Então, mas esse não é o grande problema…acontece que a DLL na minha máquina está no System32. E não seria o problema copiar a DLL no System32 do usuário…
Acontece que o .JAR não procura essa .DLL.
Na hora de compilar pelo NetBeans por exemplo, ele procura e executa essa DLL.
Mas pelo .JAR creio eu que deve ter alguma opção ou alguma forma de forçar isso…
Só que ninguém sabe fazer isso…
Agora imagine uma aplicação grande que necessite de alguma dll…como os programadores fazem para executar ela???

Isso eu gostaria de saber…

A

No meu caso é uma impressora de cheque eu dou um load na DLL no start do meu applet

System.loadLibrary("minhaDLL");

E pronto da tudo certo!

B

É isso eu ainda não tinha tentado…
Nesse LoadLibrary(). Vc coloca o caminho completo da dll, ou somente o nome dela, independente do local???/

A

Só o nome da DLL sem extensão nem nada.

Se quizer o caminho todo use :

System.load("D:\Windows\system32\minhaDLL.dll");
B

Blz, vou testar e coloco o resultado…

Uma última pergunta…eu coloco isso no inicio do método main né??

A

Exato!

Se ainda tiver problemas da um toque que eu tento te ajudar.

B

Cara por incrivel que pareça não funcionou…

Eu fiz um pequeno programa que testa uma função que utiliza essa dll…
Eu estou anexando o código do programa e a API responsável pelo acesso do Registro…

Ambos são muito pequenos…menos de 500 Kb…
Se alguem se enteressar em testar a crição de Jar e tentar me ajudar…eu agradeço…
Acho que dessa forma fica mais facil…

Qualquer problema com o arquivo me mande uma MP com seu e-mail e envio direto…

A

Oi Bruno,

Eu executei sem problemas!

Como você esta executando o jar? Assim... você precisa colocar no classpath o LatteLibWin-3.0.0.jar ou... executar da seguinte forma

java -cp LatteLibWin-3.0.0.jar;testejar.jar testejar.Main

Nota : os dois jars estão na mesma pasta.

Pedaço da Resposta :
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall[code]
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\04aaf852eb8c24d7e1fbc7f4b8948dac
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\29c0ba7fc496ff1c084b2ff2d02a549b
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\57be9eb60bd42113691db7da5dd9e505
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\AddressBook
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\AdobePhotoshop6.0
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\Branding
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\ConnectionManager
(...)
4aaf852eb8c24d7e1fbc7f4b8948dac HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall9c0ba7fc496ff1c084b2ff2d02a549b HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall7be9eb60bd42113691db7da5dd9e505 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\AddressBook HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\AdobePhotoshop6.0 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\Branding HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\ConnectionManager (...) [/code]

[EDITADO]
Só mais uma coisa... você nem precisa dar load na DLL porque você usa uma API acessa a DLL, no meu caso isso não existia, eu acessava a DLL diretamente.

A

Ou ainda usando o Manifest.MF (seu problema inicial)…

Minha estrututa:

\Projeto
+- \lib
|   +- LatteLibWin-3.0.0.jar
+- testejar.jar

MANIFEST.INF

Manifest-Version: 1.0
Class-Path: lib/LatteLibWin-3.0.0.jar
Main-Class: testejar.Main

Se eu não estou enganada quando há espaço no nome do diretorio é bom coloca-lo entre aspas, pelo menos eu ja tive problemas com isso.

B

Armitage:
Ou ainda usando o Manifest.MF (seu problema inicial)…

Minha estrututa:

\Projeto
+- \lib
|   +- LatteLibWin-3.0.0.jar
+- testejar.jar

MANIFEST.INF

Manifest-Version: 1.0
Class-Path: lib/LatteLibWin-3.0.0.jar
Main-Class: testejar.Main

Se eu não estou enganada quando há espaço no nome do diretorio é bom coloca-lo entre aspas, pelo menos eu ja tive problemas com isso.

Não consigo baixar seu arquivo…
Vou testar em casa e posto a resposta…

Armitage vlw mesmo…

A

Tenta de novo!

B

Não querendo abusar…mais é o seguinte…
Estou fazendo um teste aqui com o que vc passou…

Minha Estrutura:

Criação do JAR

Isso estou executando da pasta /Project

OK…até ai ele cria o Jar…
Ai na hora de executar da o mesmo erro…

Bom peguei seu arquivo e dei uma olhada… e vi que dentro do JAR testeJAR.jar que vc mandou tem dois arquivos que no meu não tem…

O .classpath e o .project

O que são esse arquivos???

A

Eu uso o RAD (Rational Application Developer), ele cria alguns arquivos para 'manutenção' dos projetos. Se você não conhece é a nova ferramenta da IBM para desenvolvimento, substituiu o WSAD.

Vou criar o jar do mesmo jeito que você e ver no que dá... você testou o que eu te mandei? Deu erro?

Bem.. eu fiz na mão... nada como o bom e velho cmd

Criei de novo a estrutura

\Projeto
 +- \lib
 |   +- LatteLibWin-3.0.0.jar
 +- META-INF
 |   +- MANIFEST.MF
 +- testejar
 |   +- Main.class
Detalhe do Manifest
Manifest-Version: 1.0
Class-Path: lib/LatteLibWin-3.0.0.jar
Main-Class: testejar.Main
Depois :
jar cfvm testeJAR.jar META-INF/MANIFEST.MF testejar*
E na sequencia :
java -jar testeJAR.jar
E obtenho a resposta :
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall[code]
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\04aaf852eb8c24d7e1fbc7f4b8948dac
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\29c0ba7fc496ff1c084b2ff2d02a549b
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\57be9eb60bd42113691db7da5dd9e505
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\AddressBook
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\AdobePhotoshop6.0
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\Branding
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\ConnectionManager
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\DB2
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\DirectAnimation
(...)
4aaf852eb8c24d7e1fbc7f4b8948dac HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall9c0ba7fc496ff1c084b2ff2d02a549b HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall7be9eb60bd42113691db7da5dd9e505 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\AddressBook HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\AdobePhotoshop6.0 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\Branding HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\ConnectionManager HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\DB2 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\DirectAnimation (...) [/code]
B

Mais uma vez eu agradeço muito pela ajuda…
Funcionou perfeitamente…
Eu identifiquei alguns possiveis erros no meu código…

Acho que aqui não podeira ser " . " e sim como vc fez…

Outro problema estava ocorrendo no Class-Path…em vez de criar uma pasta /lib para colocar o pacote LatteLib, eu estava incluindo o caminho completo da minha instalação (c:\Arquivos de Programas…)

Bom acho que foi isso que deve ter causado erro…

Mais uma vez Obrigado…

J

O que esta aplicação faz?

abs,
JP

B

Ela é uma aplicação bem simples somente para aprendizado mesmo…
Ela altera o nome dos programas que aparecem no Adicionar e Remover Programas…

Eu tive essa idéia pois trabalhei em uma empresa que não deixava instalar programa nenhum…e a auditoria era muito ruim, pois eles só consultavam a “Adicionar e Remover Programas”. Ai resolvi criar esse programa para facilitar minha e dos meus colegas de trabalho…

Se quiser o código eu posto ele aqui…

J

Posta sim se não for muito trabalho.

e parabéns pelo programa.

:thumbup:

B

Ai vai…
Não esqueça de jogar a DLL no /System32

Criado 14 de julho de 2005
Ultima resposta 20 de jul. de 2005
Respostas 26
Participantes 6