Alguém sabe JNA - Java Access Native. Estou precisando muito resolver esse probleminha!

34 respostas
J

:?: :?: :?:

Meu programa é o seguinte…

1 - Blioteca :

#ifndef testejna_H
#define testejna_H
void librarymethod(char* whatToSay);
#endif

2 - Arquivo que implementa o método nativo

#include “testejna.h”
#include <stdio.h>

void librarymethod(char* whatToSay){

printf(Qual a melhor linguagem de programacao? \n Reposta: %s,whatToSay);

}

Com os arquivos do ponto 1 e 2 geramos uma DLL com o nome testejna.dll.

3 - Interface que possui a declaração do método na tivo :

package testejna;
import com.sun.jna.*;

public interface MySharedLibrary extends Library {
	public void librarymethod(String whatToSay);
}

4 - Classe de teste :

package testejna;

import com.sun.jna.*;

public class TestandoJNA {
public static void main(String[] args) {
			
	MySharedLibrary lib = (MySharedLibrary) Native.loadLibrary("testejna", MySharedLibrary.class);
	lib.librarymethod("Java");
}

}

Problema é o seguinte;
Esta dando esse erro ----->

Exception in thread ?main? java.lang.UnsatisfiedLinkError: Unable to load library ?testejna?

at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:100)

at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:139)

at com.sun.jna.Library$Handler.(Library.java:104)

at com.sun.jna.Native.loadLibrary(Native.java:223)

at com.sun.jna.Native.loadLibrary(Native.java:209)

at testejna.TestandoJNA.main(TestandoJNA.java:7)

Onde eu coloco o arquivo testejna.dll, no windows, para que meu programa posso enxerga-la. :?:
Qualquer coisa meu e-mail é [email removido].

34 Respostas

T

Você deve estar com problemas para compilar a DLL (talvez ela esteja compilada de modo que requeira uma biblioteca, tal como MSVCRT.DLL ou msvcp71d.dll. Dica: tente compilar a DLL de modo que ela incorpore estaticamente todas as bibliotecas que ela irá requer, e em modo release (não debug). Outra dica é usar o compilador MS VC adequado para a versão do Java, se você por algum motivo não puder incorporar as bibliotecas estaticamente ou tiver de compilar em modo debug (não release):

Java 1.4 ou anterior - Microsoft Visual Studio 6.0
Java 5.0 - Microsoft Visual Studio 6.0 ou 2003 (dependendo da revisão do Java 5.0)
Java 6.0 - Microsoft Visual Studio 2003

U

Julierme, como eu falei no blog, este erro quer dizer que tu não colocou a dll criada no PATH do sistema operacional, tenta mover ela para c:\windows\system32

J

Pessoal esta tudo tranquilo agora!
Os testes ocorreram bem tanto p o JNA, quanto p JNI.
Estou ESTUDANDO melhor JNI para entender as vantagens do JNA.
Sei que n deve existir ainda, por ser algo muito novo, mas se alguém já tiver visto pela net algum tutorial, ou documentação em português tem como me avisar!

Valeu Urubatan e desculpa pelo aperreio :P. Sim, thingol valeu tb boy! :smiley:

Agradeço por tudo! 8)
Em breve volto a falar com vcs sobre esse e outros assunto !

R

Juliano, gostava de saber qual foi a sua solução pra retirar o erro que estava tendo.

abraço

J

Existem duas formas de determinar onde uma .dll esta no PC.

Vamos usar o exemplo aqui:

1º Código - Interface que extende da biblioteca nativa (Library)

package testejna;
import com.sun.jna.Library;

public interface MinhaLibrary extends Library {
	public void metodonativo(int numero);
	public void metodonativotexto(String texto);
}

2º Código - Classe Principal

package testejna;

import com.sun.jna.Native;

import java.util.Scanner;

public class TestandoJNA {

public static void main(String[] args) {
	
		
	System.setProperty("jna.library.path","D:\\Meus documentos_Adminstrador\\A - Julierme\\Dados 2007\\Softwares\\PROGRAMAÇÃO\\C_C++\\Material C\\Estudando Bibliotecas\\minhas dll's\\dll - 2");
	
	MinhaLibrary inteface_1 = (MinhaLibrary) Native.loadLibrary("teste", MinhaLibrary.class);
       
	
	Scanner entrada = new Scanner (System.in);
	
	System.out.println("Digite uma valor String :");
	
	String valor2 = entrada.nextLine();
	inteface_1.metodonativotexto(valor2);
	
	System.out.println("Digite um valor inteiro: ");
	int valor1 = entrada.nextInt();
	inteface_1.metodonativo(valor1);
	
	
	
	
}

}

1.A primeira forma é colocando o arquivo .dll no path do Sistema Operacional. No Windows (c:\windows - na maioria das vezes)!

?O código em java ficaria dessa forma:

System.setProperty(“jna.library.path”,"");

2.A segunda forma é a que eu mais gosto já que deixe todos os arquivos do sistema, incluindo as dll?s ficam centralizados em uma única pasta (qualquer pasta), deixando consequentemente o programa mais organizado.

?O código em java ficaria dessa forma:

System.setProperty(“jna.library.path”,“D:\Meus documentos_Adminstrador\A - Julierme\Dados 2007\Softwares\PROGRAMAÇÃO\C_C++\Material C\Estudando Bibliotecas\minhas dll’s\dll - 2”);

Espero ter conseguido lhe ajudar. Qualquer coisa pode perguntar cara! Estamos ai para compartilhar informações, ok!
FLW!

R

obg juliano…

mas o meu problema não é encontrar a biblioteca .dll, mas sim a função que está na biblioteca…
penso que é por a função estar numa subclasse contida no .dll…

alguem sabe como posso aceder a essa subclasse??

pessoal porreiro[[]]]

J

Cara foi vc que fez essa DLL ou vc já pegou ela pronta! Séria bom se vc tivesse como saber como está organizada a hierarquia das funções nela! Porque tipo, JNA é muito direto cara! Simplesmente vc tem que chamar as funções que estão na DLL e trabalhar com ela no código java!
Não importa onde a função esteja no código!
Se vc estiver construindo essas dll’s não precisa ter subclasse dentro delas.

Me explica melhor o que esta fazendo, que o seu problema, pode ser um problema futuro meu! De acordo com o que vc escreveu, nunca passei por algo dessa forma!

Sim, meu nome é Julierme Araújo e não Juliano! kkkkkkkk
Mas ja estou acostumado! Todo mundo me chama de Juliano! kkkkkkkkk

R

ooi
desculpa julierme, pelo engano no nome…

Criar uma dll em vb6 que tenha fuções para o exterior não é tao simples como o Visual Basic Microsoft indica…
É necessário fazer os passos todos desta página: http://www.vb-helper.com/howto_make_standard_dll.html

Depois… para verificar se as funções estão mesmo externas… aconcelho o programa que se encontra nesta página: http://www.ucware.com/apev/index.htm

… se estiverem na tabela externa, penso que estão neste momento prontas para serem acedidas por jna ou jni
No meu caso tentei aceder utilizando jna… mas quando é executada a função no código java, gera um daqueles erros: EXCEPTION_ACCESS_VIOLATION…

penso que é poelo .dll estar a precisar de outras dll’s k estão noutra directoria… vou tentar compilar este dll com td o que é preciso mm… acho que existe essa opção no Visual Basic 6 Microsoft…

Estou certo??

J

Cara é o seguinte eu nunca programei em na linguagem visual basic não. Pensei que vc estava falando em relação C/C++. Por isso citei aqueles exemplos. ok!
Se pintar alguma dúvida em relação a C/C++ e a construção de DLL’s ou uso das mesmas, pode me procurar ok!
Flw velho!

R

oi pessoal

mesmo colocando o dll na pasta system32 continua a dar este erro:

An unexpected error has been detected by HotSpot Virtual Machine:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000, pid=3740, tid=3928

Java VM: Java HotSpot™ Client VM (1.5.0_07-b03 mixed mode)

Problematic frame:

C 0x00000000

An error report file with more information is saved as hs_err_pid3740.log

If you would like to submit a bug report, please visit:

http://java.sun.com/webapps/bugreport/crash.jsp

alguma dica??

J

Tenta colocar no c:\windows . Se continuar dando pau me avisa! O problema pode ser algo com path no qual a máquina virtual java está indo fazer a busca pela dll.
Por esse motivo, se não der certo me avisa ok!

R

Tive de desistir desta ideia…
implementei o dll em java :s… mas pronto assim ja resolvi o meu problema.

fica bem
PS: se tiver tempo ainda vou tentar ver com mais calma o que se passa realmente.

L

Alguém pode me ajudar pelo amor de Deus pq as minhas alternativas de possíveis causas já esgotaram?!

Está ocorrendo o seguinte erro:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'librarymethod': Não foi possível encontrar o procedimento especificado.

	at com.sun.jna.Function.<init>(Function.java:126)
	at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:219)
	at com.sun.jna.Library$Handler.invoke(Library.java:191)
	at $Proxy0.librarymethod(Unknown Source)
	at TestandoJNA.main(TestandoJNA.java:9)

Faz dias que estou pesquisando a causa dos erros q tem ocorrido ao utilizar JNA, na dúvida comecei um projeto do 0 de acordo com os exemplos, porém o mesmo erro acima é exibido... já coloquei a dll no c:\windows, no c:\windows\system32, já coloquei no path, de acordo com o exemplo do Julierme, enfim... e nada deu certo...

Se alguma alma boa puder me ajudar, eu agradeço... :cry:

L

Resolvi meu problema…

Eu não estava gerando corretamente o cabeçalho para a dll… :oops:

E

lilirc

Como se gera o cabeçalho pra dll? estou seguindo este material (http://www.urubatan.com.br/chamando-metodos-nativos-dllso-em-java-sem-jni/), mas tá dando o mesmo erro que vc teve.

Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'librarymethod': The specified procedure could not be found.

        at com.sun.jna.Function.<init>(Function.java:129)
        at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:232)
        at com.sun.jna.Library$Handler.invoke(Library.java:191)
        at $Proxy0.librarymethod(Unknown Source)
        at testejna.TesteJNA.main(TesteJNA.java:17)

Se puder me ajudar, muito obrigado.

L

Edifran,

Utilize o seguinte tutorial que não tem erro…

http://homepages.dcc.ufmg.br/~bigonha/Cursos/Ap/Native/JavaNativeMethod.html

Espero ter ajudado… :slight_smile:

E

Valeu a dica, mas ainda não consegui… mas vai dar certo… ah…vai… vou fazer passo a passo tudinho…de novo

Abraço.

Z

Boa noite!

Estou tendo problemas sobre como utilizar duas DLLs no Java Native Access. É o seguinte, basicamente, tenho das dlls, uma de baixo nível e outra de alto nível, sendo que a dll de alto nível utiliza a dll de baixo nível. Gostaria de saber se é possível eu utilizar estas dlls, principalmente a de alto nível que a dll que realmente me interessa. Fiz um teste utilizando JNA, mas nao funcionou.
A minha dll de alto nivel se chama: SRanger_HL.dll e a de baixo nível se chama: SRanger.dll.
Em minha aplicação java, eu faço loadLibrary(“SRanger_HL”, …) e obtendo o seguinte erro:

An unexpected error has been detected by Java Runtime Environment:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0×0afd113d, pid=1964, tid=2528

Java VM: Java HotSpot™ Client VM (1.6.0_02-b06 mixed mode)

Problematic frame:

C [SRanger.dll+0×113d]

An error report file with more information is saved as hs_err_pid1964.log

If you would like to submit a bug report, please visit:

http://java.sun.com/webapps/bugreport/crash.jsp

Java Result: 1

O que eu posso fazer? É possível fazer isso?
Desde já muito obrigado, aguardo respostas.

Z

Alguém tem alguma solução?

T

Estou a estudar sobre JNA, para fazer uma aplicação Desktop,
Teria como postar o arquivo .DLL utilizado no Tópico exposto para Testes?
Ao invés de postar os códigos geradores do mesmo .C .H

Grato pela atenção!

C

Vc registrou a dll?seja por regsvr32 ou pelo com+(que é muito mais simples, e vc consegue ver as interfaces da dll)…

S

Galera preciso de uma dica de como proceder, peguei um sdk para utilizar uma impressora e estou com algumas duvidas.

Segue o arquivo readme que vem no pacote.

Bluebird SDK ver 0.9 (Developed by Jinoh Kim & NH Huh)

bbappapi: lastest bbappapi header file & library file

CSWrapper: C# wrapper dll file fr each device

Sample: Sample source for each device

For your information when you use/refer to the RFID sample BEFORE THEN you have to install the patch file in the "0. Lib&Patch folder"

BIP1300:
    Sample\6_BBRFID\RFID_SampleApp_BIP1300_v1.2\0. Lib&Patch\RFID_Patch(BIP1300).cab

BIP6000:
    Sample\6_BBRFID\RFID_SampleApp_BIP6000_v1.2\0. Lib&Patch\RFID_Patch(BIP6000).cab

*TBD: VB.Net SDK will be released on 13th July, 2009.

Thank you.
Released by Jay Kim. 
Overseas America technical sales manager.
17th June, 2009.

possou as seguintes pastas

bbappapi -> onde possue um arquivo .h e .lib
CSWrapper -> onde possuo varias .dll e lá encontra-se a que eu quero trabalhar a Bluebird.Printer.dll

Minha duvida é como proceder para conseguir utilizar esta dll, já que ela nao possue um .h, unico .h que encontrei foi na primeira pasta mas não tem dll lah apenas um .lib, não sei se posso considerar este .lib como uma dll, já que em Linux as bibliotecas tem extensão .so, e no Windows tem extensão .dll,

Se alguem puder me dar umas dicas agradeço.

P

Olá, revaivando a thread, o meu erro é o mesmo do lilirc, porém eu não tenho acesso ao fonte da dll. No linux (com .so) funciona, mas no windows ele dá o erro.

J

Alguém pode pelo amor de Deus explicar pra q serve e como registrar uma dll? Estou tentando seguir o tutorial do Urubatan já faz dias e acho q não está dando certo por causa dessa parada de registrar a dll, q eu não faço idéia do q seja. Já dei uma olhada nesse material da UFMG (http://homepages.dcc.ufmg.br/~bigonha/Cursos/Ap/Native/JavaNativeMethod.html), mas este explica somente JNI e eu quero aprender JNA. Também dei uma olhada nesse material (http://freakxnet.de/research-eng/java-jna-and-c-dll/), mas ele começa a misturar c# e eu fiquei completamente perdido.

Caro Rodrigo Urubatan, vc poderia por favor postar o tutorial em windows? Porque acredito q no linux, como vc fez não precisa registrar a dll (.so na verdade, mas enfim…), mas no windows precisa eu não sei fazer isso, então por favor, dá uma força ae!

Vlw galera!
Fico no aguardo por respostas

P

Olá @JVini, tudo bem? Entendo bem sua dificuldade. Eu já desenvolvi uma ferramenta multiplataforma que usava uma lib em C criada pelo pessoal do CPqD de campinas. Para isso eu coloqueia lib diretamente dentro do projeto e carrehgava ela com

Bem alguns lugares onde você pode buscar referências são o grupo de usuários de JNA em https://groups.google.com/forum/?fromgroups#!forum/jna-users que me ajudou muito, pode usar o site do projeto no github https://github.com/twall/jna/ e pode dar uma olhada no meu fonte em no github https://github.com/univesp/CPqDTextoFala-Java_Wrapper, neste projeto, vais ver um protótipo funcional que depois eu melhorei e foi a entrega tão esperada e a ferramenta é usada até hoje.

Qualquer coisa poste suas dúvidas específicas ou compartilhe seu fonte para que possa ajudar. Abraçose boa sorte.

I

Desculpa ressuscitar o tópico, mas meu erro é o mesmo e tentei algumas coisas aqui e não funcionou, estou seguindo o tutorial do Urubatan no site http://www.urubatan.com.br/chamando-metodos-nativos-dllso-em-java-sem-jni/ e o seguinte erro persiste:

Exception in thread “main” java.lang.UnsatisfiedLinkError: Unable to load library ‘testejna.dll’: Não foi possível encontrar o módulo especificado.

at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:166)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:239)
at com.sun.jna.Library$Handler.<init>(Library.java:140)
at com.sun.jna.Native.loadLibrary(Native.java:393)
at com.sun.jna.Native.loadLibrary(Native.java:378)
at testejna.TesteJNA.main(TesteJNA.java:27)

Java Result: 1

Já tentei usar a solução do Julierme Siva indicando a pasta da dll, e também adicionando na pasta System32 e SysWOW64 porém sem sucesso. Talvez meu erro seja na criação da DLL, tentei criar ela pelo Visual C++ 2008 selecionando MFC DLL, quem tiver esse DLL para Windows 7 64bits que possa me passar ou que tenha alguma ideia de onde eu estou errando, agradeço por qualquer ajuda.

P

Ivan como vc está carregando a dll?

I

Tentei conforme o tutorial do Urubatan e depois fazendo as alterações do Julierme Siva que ficaram assim:

File file = new File("testejna.dll");
String diretorio = file.getAbsolutePath().substring(0, file.getAbsolutePath().indexOf("\\"+file.getName())); //obtem diretorio onde está a dll
System.out.println("file: "+diretorio);
System.setProperty("jna.library.path", diretorio);
        
MySharedLibrary lib = (MySharedLibrary) Native.loadLibrary("testejna", MySharedLibrary.class);
lib.librarymethod("Java Rocks");

Acho que pode ser na hora de criar a dll, só que não tenho certeza.

P

Bem supondo que a sua dll esteja dentro da “PASTA_DO_SEU_PROJETO/ext/” você terá de usar algo assim:

Como pode ser visto em https://github.com/univesp/CPqDTextoFala-Java_Wrapper/blob/master/src/univesp/text2speech/textofala/TextoFala2.java , tente ai.

P

Recomendo fortemente vistar o grupo de usuário JNA em https://groups.google.com/forum/?fromgroups#!forum/jna-users

I

paulopatto:
Bem supondo que a sua dll esteja dentro da “PASTA_DO_SEU_PROJETO/ext/” você terá de usar algo assim:

Como pode ser visto em https://github.com/univesp/CPqDTextoFala-Java_Wrapper/blob/master/src/univesp/text2speech/textofala/TextoFala2.java , tente ai.

Então Paulo tentei sua solução adicinando uma pasta dentro do projeto com o nome “ext” e colocando a dll lá e meu código ficou assim

String path = System.getProperty("user.dir") + System.getProperty("file.separator") + 
               "ext" + System.getProperty("file.separator") + "testejna";
System.setProperty("jna.library.path", path); 
        
System.out.println("Path "+path);
        
MySharedLibrary lib = (MySharedLibrary) Native.loadLibrary("testejna", MySharedLibrary.class);
lib.librarymethod("Java Rocks");

Só que ainda continua a mesmo erro, se souber mais alguma coisa de um toque, também vou perguntar lá no Grupo JNA.

P

Tenta assim:

String path = System.getProperty("user.dir") + System.getProperty("file.separator") + "ext";
System.setProperty("jna.library.path", path); 
        
System.out.println("Path "+path);
        
MySharedLibrary lib = (MySharedLibrary) Native.loadLibrary("testejna", MySharedLibrary.class);
lib.librarymethod("Java Rocks");
I

paulopatto estava pesquisando o grupo do jna sobre esse erro e um usuário recomendou um programa chamado “depends.exe” onde é possível verificar se há erro nas dependências da sua dll. Então baixei esse programa e nele fala que minha dll possui erros informando o seguinte:

Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module.
Error: Modules with different CPU types were found.

Seu código acredito que esteja certo mas, minha dll possui erros que impede a execução da mesma, então queria saber se você tem uma dll pronta e possa me passar para eu fazer os testes aqui, no mais vou apanhando para criar uma dll em C++.
Outra coisa você usa qual programa pra criar suas DLLs? Aqui estou tentando com o Microsoft Visual Studio 2008.

P

Ixxi cara nem mexo mais con plataforma Windows… o máximo que oncseguiria era gera um código em GCC no Linux… Talvez o erro seja do tipo DLL para 32bits que não roda em 64bits. vc compilo essa dll nesta mesma CPU (máquina)? No caso eu usava um DLL de terceiro na época deste projeto que te mostrei.

Veja ai se esses links de ajudam ou procura um tuto de criação de dll no google.com

http://elitecaos.forumeiro.net/t1657-tutorial-criando-uma-dll-para-combat-arms


http://imasters.com.br/artigo/3230/linguagens/criando-minha-primeira-dll
http://msdn.microsoft.com/en-us/library/9ec4c5e4(v=vs.80).aspx

Criado 23 de setembro de 2007
Ultima resposta 20 de set. de 2012
Respostas 34
Participantes 13