Exemplo de JNI ou JNA que funcione

24 respostas
I

OLá pessoal! Estou procurando na net algum exemplo simples que mostre o funcionamento do JNA ou JNI.
O que acontece que não existe nenhum tutorial bem explicativo. Quando vc utiliza ele não funciona.
Alguem tem algum exemplo simples que funcione, mas bem explicativo para me mostrar ?

24 Respostas

D

eu ja fiz esse… e esta bem explicativo…

http://eupodiatamatando.com/estudos/tutorial-jni/

V

Por favor, EVITE LETRAS MAIÚSCULAS EM EXCESSO NO TÍTULO DOS TÓPICOS.

D

insdo:
OLá pessoal! Estou procurando na net algum exemplo simples que mostre o funcionamento do JNA ou JNI.
O que acontece que não existe nenhum tutorial bem explicativo. Quando vc utiliza ele não funciona.
Alguem tem algum exemplo simples que funcione, mas bem explicativo para me mostrar ?

Quais você fez e não conseguiu?
Todos os que eu utilizei sempre funcionam. Talvez você esteja fazendo alguma coisa errada e não seja culpa dos tutoriais.

I

Estou tentando fazer a do colega ai de cima… mas não consigo gerar o cabeçalho H.

O cabeçalho para funcionar tem que ser necessariamente gerado pela ferramenta javah ?
Naquele tutorial so disse para por “javah OlaMundo”, não exemplifica…o funcionamento…

I

Aliás não existe tutorial exemplifica na net, sobre este assunto. E quem sabe não quer ensinar. so fica reclamando.

D

Camarada, acho que você está procurando nos lugares errados.
Você tentou fazer daquela forma, com o utilitário javah?
Se tentou, o que não funcionou?
Se não, qual foi a forma que você tentou?

A idéia básica do utilitário javah é pegar a estrutura da classe java que foi desenvolvida anteriormente e, a partir desta, gerar uma estrutura de header (.h) para um aplicativo em C ou C++.
Semana passada eu montei uma apostila de java avançado em que isto é ensinado, então, tenho um exemplo de arquivo .h gerado por este utilitário.
Segue a classe java original e o arquivo .h

/Classe SaudacaoJNI
public class SaudacaoJni{
	public static native String msgBoasVindas(String nome);
}
//Arquivo SaudacaoJNI.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class SaudacaoJni */

#ifndef _Included_SaudacaoJni
#define _Included_SaudacaoJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     SaudacaoJni
 * Method:    msgBoasVindas
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_SaudacaoJni_msgBoasVindas
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
#endif

Além deste arquivo .h, é preciso gerar o arquivo .c ou .cpp e, incluir no projeto que se tornará a dll, os arquivos jni.h e jni_md.h (o primeiro se encontra na pasta include e o segundo em include/win32 do diretório onde o java está instalado - JAVA_HOME).

D

a linha de comando reconhece o javah?
se não vc nao configurou o java_home no seu pc… ai fica dificil realmente vc fazer o exemplo…

vc utiliza windows ou linux?

se for linux vc vai la na pasta bin do jre via comando… e chama o javah

exemplo:

javah /home/user/meuUsuario/OlaMundo

mais ou menos isso… acredito que no windows se faça assim tbm…

I

Ok ja configurei as variáveis de ambiente creio, que seja na hora de gerar que da o erro.

I

Não entendi o que o colega de cima quis dizer com os arquilhos jni.h e jni_md ?

D

Eu segui este tutorial aqui e consegui fazer.
Abra o local onde você instalou o jdk (aquele que usou para definir o JAVA_HOME). Dentro dele existirá, entre outros, o diretório include. Nele você encontra o arquivo jni.h e a pasta win32, onde estará o arquivo jni_md.h.

Mais fácil que isso, só desenhando.

I

Na hora de vc carregar a dll aonde vc pois ela para funcionar ? Eu estava carregando junto, mas está dando erro no path
“java.library.path”. Estava tentando tambm seta o caminho pelo setProperty mas não deu certo

public class Principal
{
    public native void imprimir(String nome);
    
    static
    {
       System.setProperty("java.library.path", "C:\\Users\\Nome\\Documents\\NetBeansProjects\\JNI3\\libDinamica5");
        System.loadLibrary("libDinamica5");
    }
    
    public static void main(String[] args)
    {
        Principal p = new Principal();
        p.imprimir("OLa");
    }
}
D

Independente da versão do Windows, na System32.
Ou então, junto à classe que você gerou.
Se você está usando um projeto, coloque-a na raiz do projeto.

I

Valeu eu conseguir rodar na System32. Mas não consegui fazer rodar com a dll junto ao projeto.
Notei tambm que quando crio mais de um método ele não consegue identifar o segundo.
As assinaturas dos métodos tem que ser igual do cabeçalho ?

D

Temos o seguinte, dada a classe abaixo:

package teste;

public class Teste{
    public static native String msg();
}

O conteúdo correspondente, gerado pelo javah seria algo como:

#include <jni.h>  
/* Header for class Teste */  
  
#ifndef _Included_Teste  
#define _Included_Teste  
#ifdef __cplusplus  
extern "C" {  
#endif  
JNIEXPORT jstring JNICALL Java_teste_Teste_msg(JNIEnv *, jclass);
#ifdef __cplusplus  
}  
#endif  
#endif
I

Eu consegui gerar o conteúdo de cabeçalho…e funcionar um método…
Coloequei a dl na pasta system32, mas queria carregar ela junto com jar

D

Faz assim, posta um print da estrutura do projeto, pois eu criei a DLL e carreguei-a junto ao projeto e está funcionando.

I

Tinha gerado primeiro com o Mingw mas não tava funcionando acho por causa de dependências de bibliotecas…
ai este aki fiz com o visual studio, e coloquei a dll no system 32…
so funciona um método imprimir. Se eu colocar mais de um ja era não funciona mais… e tambm não esta pasando parametros…

public class Principal
{
    public native void imprimir();

    static
    {
        System.loadLibrary("Dinamica5");
    
    }
    
    public static void main(String[] args)
    {
        Principal p = new Principal();
        p.imprimir();
    }
}

Cabeçalho

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Principal */

#ifndef _Included_Principal
#define _Included_Principal
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Principal
 * Method:    imprimir
 * Signature: ()V
 */

JNIEXPORT void JNICALL Java_Principal_imprimir
  (JNIEnv *, jobject);


#ifdef __cplusplus
}
#endif
#endif
#include "Principal.h"
#include <iostream>


JNIEXPORT void JNICALL Java_Principal_imprimir(JNIEnv *, jobject)
{
	std::cout<<"Olá Mundo";
}
D

Estranho, eu desenvolvi uma calculadora em java em que todas as operações estavam sendo executadas via JNI no código C++ que criei no Visual Studio, com a ajuda do .h criado pelo javah.
Como se trata de uma calculadora, estou enviando dois parâmetros, o cálculo é feito no C++ e devolvido.
Além do mais, consigo colocá-la junto ao projeto que criei.

I

Em qual pasta vc colocou sua dll ? E como vc a chamou ?

D

O nome da DLL não importa e, como eu disse anteriormente, na raiz do projeto, junto a pasta src.
O nome da DLL é indiferente, visto que você vai definir no System.loadLibrary, certo?

I

Pois mas se colocar no src a dll vai estar dentro do jar né…
mas no meu não funciona…so com caminho…System.load

I

Já consegui resolver o problema agora minha dll está portatil junto com jar…estou carregando junto na pasta lib…mas fiz diferente do seu…

D

O bom da programação é que não existe apenas uma maneira de fazer a mesma coisa.
E é essa diversidade que permite que o que parecia ser bom possa se tornar melhor.

A

Este exemplo é em JNA …
http://www.guj.com.br/java/277202-abrindo-e-fechando-gaveta-do-cd-rom

Criado 31 de janeiro de 2013
Ultima resposta 3 de fev. de 2013
Respostas 24
Participantes 5