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
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
Ci sono gli "include" inseriti nell'SDK...
Cmq non sono pratico...
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?
non ne ho idea
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
23-08-2005: Udinese in cémpions lìg
Questa estate l'ho passata a Tallin
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.
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.