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 ?
Exemplo de JNI ou JNA que funcione
24 Respostas
eu ja fiz esse… e esta bem explicativo…
Por favor, EVITE LETRAS MAIÚSCULAS EM EXCESSO NO TÍTULO DOS TÓPICOS.
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.
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…
Aliás não existe tutorial exemplifica na net, sobre este assunto. E quem sabe não quer ensinar. so fica reclamando.
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).
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…
Ok ja configurei as variáveis de ambiente creio, que seja na hora de gerar que da o erro.
Não entendi o que o colega de cima quis dizer com os arquilhos jni.h e jni_md ?
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.
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");
}
}
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.
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 ?
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
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
Faz assim, posta um print da estrutura do projeto, pois eu criei a DLL e carreguei-a junto ao projeto e está funcionando.
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";
}
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.
Em qual pasta vc colocou sua dll ? E como vc a chamou ?
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?
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
Já consegui resolver o problema agora minha dll está portatil junto com jar…estou carregando junto na pasta lib…mas fiz diferente do seu…
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.
Este exemplo é em JNA …
http://www.guj.com.br/java/277202-abrindo-e-fechando-gaveta-do-cd-rom