Ray da Costa

« Pegar IP da maquina local com Java | Home | Aredondamento de números em J2ME »

Acesso nativo com Java e Delphi (JNI)

de raydacosta | Segunda, 24 de Agosto de 2009

http://edn.embarcadero.com/article/images/10279/Delphi3.jpg

Demorou mas apareceu…

Tive que desenvolver uma aplicação jav apara consumir uma DLL em Delphi, bicho que robada.
mas com a ajuda do camaradas de C/C++ fizemos a gambi. Hehheeheh.
Construimos uma classe wrapper em C/C++ que consome a DLL em Delphi e assim a coisa foi redonda.
Até existe um procedimento para acessar a dll Delphi, mas muito enrrolado, segue abaixo.

java <---> c/c++ <----> delphi via JNI

Como implementar um código Java acessando uma DLL em Delphi.
Para c/c++ este procedimento via JNI é bem comum, mas com Delphi nunca tinha feito. O que muda mesmo são as APIs de geração dos Stubs que mudaram, resumo, nao vem com o código nativo do Java.

Baixar
http://www.pacifier.com/~mmead/jni/delphi/JEDI/PAS/JNI.pas
É muito importate este fonte, ele é uma caixa preta, ele que faz a interfacce com a Java.
fonte para vc dar uma olhada: http://www.pacifier.com/~mmead/jni/delphi/JEDI/DOCS/src/jni_pas.html

http://www.pacifier.com/~mmead/jni/delphi/files/jni_pas.zip
http://www.pacifier.com/~mmead/jni/delphi/JEDI/PAS/JNI_MD.INC

Gerador de Stub
http://www.pacifier.com/~mmead/jni/delphi/JavaToDPR/index.html
JavaToDPR - Uma ferramenta (escrito em Java) para criar um Delphi dpr. Arquivo de um arquivo de classe Java.. É uma espécie de análogo ao javah ferramenta que vem com o JDK. Ambos são gratuitos e podem ajudar você a começar a escrever código nativo que está a ser chamado de Java Javad - Uma ferramenta semelhante ao de cima na medida em que gera o código Delphi a partir de um arquivo de classe Java.

ou

JAVADPR
javadpr Windows é um executável nativo que produz um arquivo de projeto Delphi a partir de métodos nativos declarado em um arquivo de classe Java. O arquivo resultante do projeto Delphi compilado em uma DLL que é usado pelo Java para interagir com o Delphi via Java Native Interface (JNI ) A fonte do Delphi está incluído no pacote abaixo, portanto, é simplesmente uma questão de compilá-lo com o Kylix para produzir um executável nativo do Linux. (Pode ser necessário um javadpr $ IFDEF) é um trabalho em andamento e há algumas questões que ainda precisam ser analisadas No entanto, em seu estado atual, javadpr é uma ferramenta de boas-vindas para os programadores Delphi usando o Java Native Interface. Ajuda pacote Exemplo de página de download inclui exemplos, o javadpr binária do Windows, ea fonte de Delphi. (~ 62 KB)
Para usar esta api a dll jvm.dll tem que estar no mesmo diretorio do executavel javadpr.exe.
http://www.pacifier.com/~mmead/jni/delphi/javadpr/javadpr.zip

OBSERVAÇÃO
A última versão oficial do JNI.pas é datado de 1 de novembro de 2002 e inclui suporte para JDK 1.1.x, 1.2.x, 1.3.x e 1.4.x tanto em Windows (Delphi) e Linux (Kylix). Ver-o. Faça o download. (Inclui MD.INC JNI)

IMPORTATNE
Nota para Delphi 5 Usuários JNI.pas O arquivo contém diretivas de compilador para lidar com as diferenças entre o Linux (Kylix) e Windows (Delphi). Especificamente, existem diretivas: ($ IFDEF MSWINDOWS) e ($ IFDEF LINUX), que indica a plataforma. Define LINUX Kylix e Delphi 6 e 7 definem MSWINDOWS. Delphi 5 não define MSWINDOWS, então você precisa definir isso manualmente. Para definir isso em Delphi 5, vá para o Projeto | Opções | Directories / Conditionals e adicionar MSWINDOWS ao condicional define.

OBS: NESTE EXEMPLO NAO E NECESSÁRIO UTILIZAR OS GERADORES DE STUBS
——————————————————————

CLASSE JAVA
———–

class HelloWorld
{
public native void displayHelloWorld();
static
{
System.loadLibrary(”HelloWorDELPHI”);
}
}

class Main
{
public static void main(String[] args)
{
HelloWorld hw = new HelloWorld();
hw.displayHelloWorld();
}
}

COMPILAR

CLASSE NATIVA
————-

library HelloWorlDELPHI;

uses
JNI;

procedure Java_HelloWorld_displayHelloWorld(PEnv: PJNIEnv; Obj: JObject); {$IFDEF WIN32} stdcall; {$ENDIF} {$IFDEF LINUX} cdecl; {$ENDIF}
begin
Writeln(’Hello world!’);
end;

exports
Java_HelloWorld_DisplayHelloWorld;

end.

————————————————————————————————–

Obs.: Para executar sua classe dentro de pacote o comando de linha é
“C:\Program Files\Java\jdk1.6.0_12\bin\javah” -classpath C:\projetosnetbeans\JSenhaPWrapper\build\classes -jni -o JWrapper.h senhap.JWrapper”

Mas o que foi realizado
Em C/C++

1 - Você gera a sua classe Xpto.java
2 - Compila a classe
Criar esta classe sem pacote, nao criar esta classe dentro de pacotes….
Esta classe deverá ter o metodo que vc estará chamando
Criar metodo/atributos nativos correspondente aos que vc estará chamando em C/C++:
private static native int XPTOLog(String UserName, String Password);

O mesmo será usado da seguinte forma:
result = Xpto.XPTOLog(UserName, Password);

3 - Aplica na classe o javah.exe
Comando a ser utilizado:
javah -jni -o Xpto.h Xpto

3 - Deverpa ser gerado um arquivo Xpto.h (Stub)
Este arquivo c/c++ deverá conter o metodo correspondente ao existente na classe Java.
Ou seja, este metodo que vc estará chamando:
Mais ou menos alguma coisa assim: Java_XPTOLog

NAO PODE ESQUECER DE PASSAR PARA WRAPPER O NOME DO METODO QUE DEVERÁ FICAR DISPONÍVEL:
JNIEXPORT jint JNICALL Java_XPTOLog(JNIEnv * env, jclass, jstring user, jstring pwd)

4 - Este arquivo Xpto.h deverá ser encorporado no projeto em C/C++ e compilado
5 - Compilar a dll

#include “Xpto.h”
#define DLLNAME “JNIDll.dll” - delphi

6 - Colocar estas dll no system32 e carregar assim: System.loadLibrary(”JNIDll”);
ou ampontar doretamente com o : System.load(”C:\\projetosnetbeans\\Dll\\JNIDll.dll”);

7 - pronto so executar…

obs.> Podem ocorrer erros de carregamento. Necessário verificar se a sua dll nao tem nenhuma outra dll que tem que estar no mesmo lugar.

Este processo tive a ajuda de um amigão Fabio Garbin.

Obs.: Colocar todos no mesmo doretorio (codigo java e dll) e executar java Main

Mais detalhes.
http://www.pacifier.com/~mmead/jni/delphi/JEDI/DOCS/delphi-jni-1.html

Categorias: Java |  | Enviar por e-mail  | Hits para esta publicação: 564

2 comentários para “ Acesso nativo com Java e Delphi (JNI) ”

  1. rafael Says:
    Segunda, 31 de Agosto de 2009 at 12:38

    eu vou trrabalhar ae como GERENTE ne sr Ray da Costa

  2. rafael Says:
    Segunda, 31 de Agosto de 2009 at 12:40

    eu vou trabalha ai como GERENTE ne sr Ray da Costa
    nossa sua empresa cresceu em bicho que roubada esse
    delphi com java em !!!!!!

Deixe uma resposta.