JNI / HtmlSnapshot

4 respostas
fredabcdef

Olá pessoal,

Estou com um pepinasso aqui no serviço.
Preciso fazer um teste com uma lib externa (HtmlSnapshot).
O código da aplicação é em Java, e para acessar a lib, será necessário utilizar JNI.

O grande problema é que nunca usei o JNI.

Pelo que pesquisei, funciona da seguinte maneira:

1 - Crio uma classe java que acessa a dll e que tem as chamadas dos métodos nativos.
2- Crio um header a partir da classe Java, e crio meu codigo C++ utilizando o header criado.
3 - Gero o .dll a partir do passo 2.
4 - Com a classe do passo 1 eu consigo utilizar os métodos da classe C++.

Ok, na teoria tudo muito bonito.

Mas olhem meu caso, o HtmlSnapshot, possui um demo que faria essa interface JNI.
Na demo vem a classe java q chama os metodos nativos, o dll gerado a partir do codigo C, o .cpp, tudo que seria necessário para rodar certinho.

Mas quando eu monto um projeto no eclipse, e tento rodar a classe, sempre da o maldito erro de UnsatisfiedLinkError.

Vcs sabem se eu tenho que configurar algo no eclipse , ou alguma variavel de ambiente ou qualquer outra coisa ??

Ja tentei usando o System.load e o System.loadLibrary, mas não deu certo. =/

Algúem ae tem alguma ideia pra me ajudar ??

Obrigado ae gtn.

4 Respostas

matheuslmota

System.loadLibrary procura a DLL nos diretórios padrões.
System.load procura a DLL no mesmo diretório do executável que tá chamano sua dll, isso se você passar só o nome da DLL. Você pode passar o caminho completo da DLL para o System.load() que ele carregará a DLL a partir do caminho específicado.
Qualquer dúvida avisa.
Abs.

fredabcdef

Opa, valeu cara.
Eu configurei o System.load, e ele achou a dll.
Depois tive um problema no metodo nativo.

Quando abri o cpp, vi q ele estava esperando q minha classe estivesse em um pacote diferente.

Ae q fica a duvida, para eu colocar isso agora preciso colocar dentro dos padroes de pacotes aqui do projeto.
Basta eu renomear os metodos do cpp, e o .h, e dar um build em uma ferramenta tipo Visual C++ ??

Abraço.

matheuslmota

Sim, isso mesmo.
Só por curiosidade como tu gerou esse header?
Aconselho que você gere ele assim:
Tu tem uma classe compilada. Então use o seguinte comando:

javah -jni SuaClasse//SuaClasse é o nome da classe compilada sem o ".class"

Use então o header gerado para criar a dll a partir dele.
Abs.

fredabcdef

Cara,

esse Header, cpp , dll e tals, eu baixei de um Demo de um aplicativo chamado HtmlSnapShot.

To rodando o JNI baseado nesses arquivos do demo.
Agora, qro testar na aplicacao, onde a hierarquia dos pacotes sao diferentes.

Mas enfim, eu gerando um novo header apontando para a classe dentro da minha aplicacao, importando esse header no Visual C++ e gerando um novo dll, deve funcionar certo ?

Vou fazer o teste, quando tiver um feedback posto aqui.

Vlw.

Criado 20 de julho de 2011
Ultima resposta 20 de jul. de 2011
Respostas 4
Participantes 2