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

:?: :?: :?:

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 é julierme.silva@gmail.com.

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

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

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 !

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

abraço

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!

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[[]]]

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

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??

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!

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??

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!

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.

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

Está ocorrendo o seguinte erro:

[code]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)[/code]

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:

Resolvi meu problema…

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

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.

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:

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

Abraço.

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.

Alguém tem alguma solução?