PDA

Visualizza la versione completa : lanciare motodi c++ da java


Odd
15-11-2002, 11:45
Ciao,

ho la necessità di eseguire un metodo di un processo in c++ da un programma java...

qualcuno mi sa dare informazioni su come fare??

grazie
ciao

l.golinelli
15-11-2002, 11:54
Ci sono gli "include" inseriti nell'SDK...

Cmq non sono pratico...

:( :( :(

pippo75
15-11-2002, 12:03
probabilmente JNI (http://java.sun.com/docs/books/tutorial/native1.1/index.html) dovrebbe fare al caso tuo ...

Odd
15-11-2002, 12:23
grazie,

ma secondo te come è possibile accedere a metodi di un programma c++ che è sta girando, quindi un processo indipendente, da un programma java?
jni permette anche questo o solo di scrivere programmi che hanno al loro interno linguaggi differenti?

:dhò:

pippo75
15-11-2002, 15:10
non ne ho idea :bhò:
ho solo dato una letta e visto che permetteva (nell'esempio) di chiamare il classico HelloWorld, solo che questo era stato scritto in c++
Ma non ho assolutamente idea se si possa chiamare dei metodi da un progamma che sta già girando

mildred
16-11-2002, 12:36
mi sembra che da JNI puoi soltanto chiamare metodi C non C++, naturalmente puoi incapsulare le chiamate a funzioni C++ in semplici wrappers C:

devi prima di tutto creare una library (.dll per microsoft o .so per *NIX) che esporta alcune funzioni C.

queste funzioni devono seguire un determinato schema di nomi (mangling) e passaggio dei parametri.

ad esempio supponiamo di avere una classe java Clazz e la library condivisa Library.dll e che dentro la classe ci sia un unico metodo C nativo invoke:

package pack;

public class Clazz
{
// automaticamente linka i tuoi metodi
static { LoadLibrary("Library"); } // .dll

native public void invoke(int a);
}

la tua library Library.dll dovrà contenere la seguente funzione C esportata (non mi ricordo come si fa sotto windows mi sembra extern "C" __NONRICORDO(dllexport))

nota bene i nomi nella funzione C:

#include "jni.h"

class CClass
{
public:
CCLass();
virtual ~CClass();

void Invoke(int a);
};

extern "C" __NONRICORDO(dllexport)
void JNICALL Java_pack_Clazz_invoke(
(JNIEnv* ENV, jobject THIS , jint a)
{
// ENV è un puntatore all'environment Java
// THIS è un puntatore alla tua classe Java

CClazz c;
c.Invoke(a);
}

la tua classe CClazz puo risiedere tranquillamente in un'altra .dll e in questo caso devi esporla ed importarla nella tua dll; mentre se vuoi lanciare altri eseguibili .exe devi scrivere il codice che ti serve da C (se devi soltanto lanciare eseguibili interi da Java, non ti serve JNI ma puoi utilizzare la classe Process oppure Runtime.exec)

sono stato stringatissimo ma se hai dubbi posta altre domande. e guarda anche la documentazione Sun.

mildred
16-11-2002, 12:44
a questo punto da Java puoi fare:

Clazz c = new Clazz();
c.invoke(451);

e il metodo della classe C++ CClazz sarà chiamato automaticamente con il parametro 451.

per chiamare metodi di un programma in *esecuzione* la cosa è un po più complicata e bisogna sapere che sistema operativo stai usando.

Loading