Olá Jorge
Para você utilizar uma biblioteca (DLL ou SO) é necessário que você
escreva uma classe Java com a API JNI.
Atente para a carga da biblioteca na parte estática da sua classe.
Abaixo segue um exemplo:
Código Java
/**
* Alterado: Ricardo Santana - 22/11/2000.
* Objetivo: Acrescentar o método getSession().
*/
package com.eversystems.rcmllink;
import java.lang.*;
import java.util.*;
/**
* Classe que implementa a interface entre a TH (Java) e o RCML/Link (C++)
*
* @author EverTeam (Ricardo Santana) - 20/11/2000.
* @version 1.0
*/
public class RCMLLink {
// C++
private native long AllocCPP();
private native int FreeCPP(long lSessionId);
private native int SendReceiveCPP(long lSessionId, String sSendBuffer,
String sFileName);
private native int ReceiveFileCPP(long lSessionId, String sFileName);
private native String GetReceiveBufferCPP();
/**
* Carrega a biblioteca rcmllink.dll/librcmllink.so automaticamente.
*/
static {
System.loadLibrary("rcmllink");
}
/**
* Identificador da sessão com o RCML/Link
*/
private long SessionId = -1L;
/**
* Armazena o buffer de envio.
*/
private String SendBuffer;
/**
* Armazena o buffer de recebimento.
*/
private String ReceiveBuffer;
/**
* Armazena a variável DebugON do ambiente.
*/
private String DebugON;
/**
* Construtor da classe
*
* @author EverTeam (Ricardo Santana) - 20/11/2000.
*/
public RCMLLink() {
// Inicializa as variáveis
reset();
DebugON = System.getProperty("DebugON","NO").toUpperCase();
return;
}
/**
* Exibe mensagem na saída padrão se DebugON diferente de "NO".
*
* @author EverTeam (Elton Carneiro) - 08/12/2000.
*/
public void log(String strLog) {
if (! DebugON.equals("NO") ) {
System.out.println(strLog);
}
return;
}
/**
* Obtém uma sessão com o RCML/Link.
*
* @return Id da sessão.
*/
public boolean alloc() {
boolean bResult = false;
try {
if(SessionId == -1L) {
SessionId = AllocCPP();
if(SessionId >= 0L)
bResult = true;
}
} catch(Exception eError) {
// Falha na operação.
SessionId = -1L;
}
return bResult;
}
/**
* Preeche o buffer de envio.
*
* @param sData Dados a serem enviados
*/
public void setSendBuffer(String sData) {
try {
if(SessionId >= 0L) {
if(sData == null) {
sData = "";
}
SendBuffer = sData;
}
} catch(Exception eError) {
// Falha na operação.
}
return;
}
/**
* Limpa o conteúdo do buffer de envio.
*
*/
public void clearSendBuffer() {
try {
if(SessionId >= 0L) {
SendBuffer = "";
}
} catch(Exception eError) {
// Falha na operação.
}
return;
}
/**
* Obtém o conteúdo do buffer de recebimento.
*
* @return Dados obtidos do RCML/Link ou "";
*/
public String getReceiveBuffer() {
String sData = null;
try {
if(SessionId >= 0L) {
sData = ReceiveBuffer;
}
} catch(Exception eError) {
// Falha na operação.
sData = "";
}
return sData;
}
/**
* Limpa o conteúdo do buffer de recebimento.
*
*/
public void clearReceiveBuffer() {
try {
if(SessionId >= 0L) {
ReceiveBuffer = "";
}
} catch(Exception eError) {
// Falha na operação.
}
return;
}
/**
* Libera a sessão com o RCML/Link.
*
* @return Status da operação.
*/
public int free() {
int iSuccess = 0;
try {
if(SessionId >= 0L) {
iSuccess = FreeCPP(SessionId);
reset();
}
} catch(Exception eError) {
// Falha na operação.
iSuccess = 1;
}
return iSuccess;
}
/**
* Envia uma transação para a aplicação servidora e aguarda o retorno
*
* @param sFileName Nome do arquivo associado ou null.
* @return Status da operação.
*/
public int sendReceive(String sFileName) {
int iSuccess = 0;
log("sendReceive [SendBuffer] = [" + SendBuffer + "]");
try {
if(SessionId >= 0L) {
if(sFileName == null) {
sFileName = "";
}
// Envia a transação
iSuccess = SendReceiveCPP(SessionId, SendBuffer,
sFileName);
// Obtém o buffer de descida
ReceiveBuffer = GetReceiveBufferCPP();
}
} catch(Exception eError) {
// Falha na operação.
iSuccess = 1;
}
return iSuccess;
}
/**
* Recebe um arquivo do servidor.
*
* @param sFileName Nome do arquivo a ser recebido.
* @return Status da operação.
*/
public int receiveFile(String sFileName) {
int iSuccess = 0;
log("receiveFile [sFileName] = [" + sFileName + "]");
try {
if(SessionId >= 0L) {
// Envia a transação pedindo arquivo.
iSuccess = ReceiveFileCPP(SessionId, sFileName);
}
} catch(Exception eError) {
// Falha na operação.
iSuccess = 1;
}
return iSuccess;
}
/**
* Obtém o Identificador da Sessão.
*
* @return Id. da Sessão;
*/
public long getSession() {
return SessionId;
}
/**
* Atribui o Identificador da Sessão. <br>
* Obs.: Isso é útil quando se pretende manter o uso de uma mesma sessão
entre várias
* execuções.
*
* @param Id. da Sessão;
*/
public void setSession(long SessionIdNew) {
SessionId = SessionIdNew;
return;
}
/**
* Inicializa o conteúdo das variáveis.
*
* @author EverTeam (Ricardo Santana) - 20/11/2000.
*/
private void reset() {
// Inicializa as variáveis
SessionId = -1L;
SendBuffer = "";
ReceiveBuffer = "";
return;
}
/**
* Encerra a utilização da classe e libera os recursos alocados.
*
* @author EverTeam (Ricardo Santana) - 21/11/2000.
*/
public void destroy() {
try {
// Libera a memória ocupada pelo objeto TRcmlLink.
free();
} catch(Exception eError) {
// Falha na operação.
}
return;
}
}
Código em C
/**
* Implementação do acesso à API do RCML/Link.
*
* @author EverTeam (Ricardo Santana) - 21/11/2000.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <jni.h>
#include "rcmllink.hpp"
#include "rcmlnk.hpp"
char receiveBuffer[8*1024];
char sendBuffer[1024];
TRcmlLink *rcml = NULL;
/**
* Obtém uma sessão com o RCML/Link.
*
* @return Id da sessão.
*/
JNIEXPORT jlong JNICALL Java_RCMLLink_AllocCPP(JNIEnv *env, jobject obj) {
// Obtém uma sessão
rcml = new (TRcmlLink);
return rcml->Alloc();
}
/**
* Libera a sessão com o RCML/Link.
*
* @param SessionId Identificador da sessão.
* @return Status da operação.
*/
JNIEXPORT jint JNICALL Java_RCMLLink_FreeCPP(JNIEnv *env, jobject obj, jlong
SessionId) {
int iResult;
iResult = rcml->Free(SessionId);
// Obtém uma sessão
delete rcml;
return iResult;
}
/**
* Obtém o conteúdo do buffer de recebimento.
*
* @return Dados obtidos do RCML/Link ou "";
*/
JNIEXPORT jstring JNICALL Java_RCMLLink_GetReceiveBufferCPP(JNIEnv *env,
jobject obj) {
//return env->NewStringUTF(env, receiveBuffer);
return env->NewStringUTF(receiveBuffer);
}
/**
* Recebe um arquivo do servidor.
*
* @param SessionId Identificador da sessão.
* @param FileName Nome do arquivo a ser recebido.
* @return Status da operação.
*/
JNIEXPORT jint JNICALL Java_RCMLLink_ReceiveFileCPP(JNIEnv *env, jobject
obj, jlong SessionId, jstring FileName) {
int iResult;
char buffFileName[128];
// Recupera o conteúdo passado.
const char *ptrFileName = env->GetStringUTFChars(FileName, 0);
strcpy( buffFileName, ptrFileName );
iResult = rcml->ReceiveFile(SessionId, buffFileName);
// Libera os recursos obtidos.
env->ReleaseStringUTFChars(FileName, buffFileName);
return iResult;
}
/**
* Envia uma transação para a aplicação servidora e aguarda o retorno.
*
* @param SessionId Identificador da sessão.
* @param Data Buffer de envio.
* @param FileName Nome do arquivo associado ou null.
* @return Status da operação.
*/
JNIEXPORT jint JNICALL Java_RCMLLink_SendReceiveCPP(JNIEnv *env, jobject
obj,
jlong SessionId,
jstring Data,
jstring FileName) {
int iResult;
char buffFileName[128];
// Recupera o conteúdo passado.
const char *ptrFileName = env->GetStringUTFChars(FileName, 0);
// Recupera o conteúdo passado.
const char *ptrData = env->GetStringUTFChars(Data, 0);
// Armazena o conteúdo no buffer de subida.
strcpy(sendBuffer, ptrData);
strcpy( buffFileName, ptrFileName );
iResult = rcml->SendReceive(SessionId, sendBuffer, receiveBuffer,
buffFileName);
// Libera os recursos obtidos.
env->ReleaseStringUTFChars(FileName, buffFileName);
env->ReleaseStringUTFChars(Data, ptrData);
return iResult;
}
Espero que te ajude!
Santana
-----Mensagem original-----
De: Jorge Martins [mailto:[EMAIL PROTECTED]]
Enviada em: sexta-feira, 2 de fevereiro de 2001 15:47
Para: '[EMAIL PROTECTED]'
Assunto: [java-list] Shared Memory
Pessoal,
Como é possível comunicar em java usando shared memory com um programa
não-java? Preciso disso com uma certa urgência. Se alguém tiver qualquer
referência, exemplo, etc. favor enviar.
abraços
Jorge
------------------------------ LISTA SOUJAVA ----------------------------
http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
para sair da lista: envie email para [EMAIL PROTECTED]
-------------------------------------------------------------------------
------------------------------ LISTA SOUJAVA ----------------------------
http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
para sair da lista: envie email para [EMAIL PROTECTED]
-------------------------------------------------------------------------