Acesso a DLL (Windows)

Oi, pessoal,

desenvolvo uma aplicação em JAVA e existem alguns dados que deverão ser tratados por uma DLL escrita em C++. Pergunto:
como faço para usar essa DLL?
Encontrei algumas soluções usando Java Native Interface (JNI), mas os exemplos me mostraram apenas como desenvolver uma DLL utilizando essa interface. Agora, por exemplo, se eu preciso usar algum método de uma DLL já escrita e registrada, será que é possível?

Qualquer ajuda é muito bem vinda!

Bom, ate onde eu sei, voce tem que fazer uma funcao para chamar a funcao que voce quer. Por exemplo, se voce precisar rodar a funcao “funcaoDaDll” de uma detreminada Dll, voce faz uma outra Dll que, utilizando as chamadas JNI, chama a funcao da Dll original.

Mas sei la se assim eh o correto… li mto pouco sobre JNI… mas na falta de outra resposta, talvez ajude :slight_smile:

Rafael

Depois de feita a dll e colocada na pasta system, deve-se usar a seguinte linha de comando para carregar a dll.
Depois de carregada, é só usar as funções incluídas na dll.

static { System.loadLibrary(“Canvas”); }

onde Canvas o nome de sua dll

Beleza, pessoal!

Entendi o que você explicou, Mário! Mas vou tentar explicar o que eu tenho que enfrentar:

Estou desenvolvendo junto com um amigo um software para atender uma determinada área da engenharia, que futuramente tem a idéia de se tornar algo comercial. Esse amigo é analista C++ e está querendo guardar toda a lógica dele em uma DLL, pois JAVA é fácil de ser descompilado, entre alguns outros motivos pessoais DELE.
como ele exerce a função de “meu chefe”, ele propôs a idéia de eu acessar uma DLL, enviando alguns dados e que irá retornar uns outros, para que nossos módulos conversem mutuamente. Acho que até aí você entendeu, né? Ou seja, é uma aplicação JAVA (front-end) que irá conversar com uma aplicação C++ (back-end).

A grande dúvida é com relação aos dados que teremos que transmitir, bem como deve ocorrer as chamadas aos métodos da DLL dele!

sim, claro, por mim, eu desenvolveria TUDO em java, até porque, no futuro, o back-end irá rodar em um servidor dedicado e apenas o front irá para o cliente. Mas, como ele é bacharel em Ciências da Computação e eu apenas um simples e mero programador que mal sei escrever o nome, fica difícil argumentar. Até porque é difícil argumentar com o Jaime!
Mas valeu pela ajuda!

Oi pessoal me desculpem a falta de frequencia no Site :oops: e que to atolado ate o pescoço de serviço :shock:.

Bom tanjajr em JNI modestia parte estou fera :smiley: pq estou implementando varias classes para o JAVA usando interface JNI principalmente para acesso ao hardware, bom como sou programador C/C++ e to na fila do JAVA conheci o melhor dos dois mundos(to ate devendo um tutorial mais o tempo … ta mal). pede para seu amigo programador C++ procurar por JNI no google no site da SUN tem um otimo tutorial tb, no site da GNU documentention existe um para o GCC que pode ser impregado com o Mingw, mais se ele estiver com pressa, pede para ele me mandar um email que eu mando um exemplo mais mesmo assim vou te mostrar um rapido how-tu :).

Digamos que java não tivesse uma função para escrever no terminal, e vc quisesse uma função que imprimisse a soma de dois valores no terminal.
sua classe java ficaria assim:

public class Teste {  

  public native void printsoma(int a,int b);

  static {
    System.loadLibrary("teste");
  }

  public static void main(String[] args) {

     new Teste().printsoma(50,50);
  }

}

O arquivo .h do seu cologa ficaria assim, esse arquivo foi gerado pelo utilitario javah.

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

#ifndef _Included_Teste
#define _Included_Teste
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Teste
 * Method:    printsoma
 * Signature: (II)V
 */
JNIEXPORT void JNICALL Java_Teste_printsoma
  (JNIEnv *env, jobject obj, jint a, jint b);

#ifdef __cplusplus
}
#endif
#endif

O arquivo .cpp dele ficaria desse modo:

#include <jni.h>
#include "Teste.h"
#include <stdio.h>


JNIEXPORT void JNICALL
Java_Teste_printsoma(JNIEnv *env, jobject obj, jint a, jint b)
{
  int c;
  c=a+b;
  printf("Soma Total:%i",c);

}

para ele compilar ele faria o seguinte, aqui estou supondo que seu amigo use o Microsoft Visual C/C++ 5.0 ou superior:

cl -Ic:j2sdk1.4.0_03include -Ic:j2sdk1.4.0_03includewin32 -LD teste.c -Fe%teste

PS: os diretorio tem de ser mudados de acordo com o diretorio do seu colega e o nome dos arquivo .c tem teste e ficar no mesmo diretorio da sua aplicação java ou no diretorio system.

bom galera isso e parte do tutorial que estou fazendo.
t+

Valeu, Anjo, ficou tudo muito claro pra mim!

Quanto à solução adotada por mim e o Jaime, sou eu quem teria que passar as bibliotecas dos métodos que necessitamos, ou seja, precisamos sentar e dialogar sobre o que cada método irá fazer, o que eu passo pra ele e o que ele passa pra mim!

E, a única dúvida que ainda persiste em mim, é a seguinte:

JNI não deixa eu usar funções em DLL’s já existentes, que NÃO foram criadas/compiladas usando a biblioteca que o javah gera, quando preciso criar um método nativo, certo? Por exemplo, se eu quisesse usar as funções da DLL ADODB.dll (é um nome suposto, não sei se existe), que é uma dll já nativa do Windows, eu não tenho como usá-la, certo?

Desde já, valeu! :c)

Certissimo kra, isso mesmo nao da para vc usar funções nativas que nao foram implementadas para JAVA mesmo porque isso iria de contra os principios da MULTIPLATAFORMA os metodos nativos escritos para JAVA possuem seus propios tipos então tem de ser feito essa camada de itermediação entre o JAVA e a blibioteca NATIVA vou mostrar isso com detalhes no tutorial que deve sair semana que vem.

falow !!!
:smiley:

[quote=anjomal]Certissimo kra, isso mesmo nao da para vc usar funções nativas que nao foram implementadas para JAVA mesmo porque isso iria de contra os principios da MULTIPLATAFORMA os metodos nativos escritos para JAVA possuem seus propios tipos então tem de ser feito essa camada de itermediação entre o JAVA e a blibioteca NATIVA vou mostrar isso com detalhes no tutorial que deve sair semana que vem.

falow !!!
:D[/quote]

Cara ja saiu esse tutorial? to querendo algo em portugues para ler sobre isso …