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] 
-------------------------------------------------------------------------

Responder a