|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
[C#, Java] - Richiamare Java da C#
Ho la necessita' di richiamare una funzione (tante in realta') scritta in Java da parte di un mio programma C#
Dispongo dei sorgenti di entrambi, ma non e' mia facolta' ne volonta' cambiare il codice Java monolitico e immenso che mi si para davanti. Inoltre ho la necessita' di una discreta velocita', nel senso che dovro' richiamare le funzioni Java per tante volte. Sono decisamente veloci, quindi mi seccherebbe dover spendere piu' tempo per i passaggi di informazioni piuttosto che per i calcoli veri e propri, dato che il flusso e' gia' su un percorso critico. Idee possibili?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
JNI/COM. In ogni caso sappi che non sarà una bella esperienza. Se l'input e l'output non sono particolarmente strutturati (e quindi la (de)serialization non costa troppo) puoi considerare l'uso di socket o ancora meglio named pipes, ma quello richiederebbe una serie di stub in java wrappati in una classe per gestire i messaggi...Visto che non credo che la questione sia per un progettino scolastico ti sconsiglio invece di guardare IKVM et similia.
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
Io l'ho utilizzato per delle funzioni delle JFC, ma ora sinceramente mi sfugge se si può usare anche per altre funzioni.... ![]() cmq lo puoi scaricare da qui: http://www.microsoft.com/DOWNLOADS/d...displaylang=en se gli vuoi dare un'occhiata...
__________________
|
|
|
|
|
|
|
#4 | |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Quote:
|
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
![]() se il suo codice java compila con j# (e non è detto, per quello gli ho detto di fare la prova) allora è sufficiente crearsi una dll e richiamare direttamente i metodi da C# senza bisogno di bestemmiare con JNI.
__________________
|
|
|
|
|
|
|
#6 | ||
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Quote:
In ogni caso grazie.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
||
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quote:
Comunque è il classico "gioco da ragazzi" anche nel caso in cui sia la prima esperienza: una volta scritta la prima invocazione le altre sono tutte uguali, cambiano solo i nomi.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Ma non potresti compilare il codice Java come eseguibile... quindi lanciare questo eseguibile MENTRE lanci l'altro in C#?
a questo punto credo sia una cavolata implementare una state machine condivisa in modo che i due programmi possano "parlare" rapidamente tramite comandi, o no?
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Onde comprendere la "portata" del compito che attende chi voglia scontrarsi con l'immane difficoltà di invocare dei metodi Java con JNI posto del codice:
Codice:
#include <jni.h>
#include <windows.h>
#include <stdio.h>
JNIEnv *env;
JavaVM *jvm;
HINSTANCE hvm;
jmethodID methodId;
jobject instance;
void createJVM(void);
void disposeJVM(void);
void precache(void);
int main() {
createJVM();
precache();
jint sum = (*env)->CallIntMethod(env, instance, methodId, 100, 33);
printf("La somma di 10 e 20 e' %d\n", sum);
disposeJVM();
}
void precache(void) {
jclass instanceClass = (*env)->FindClass(env, "it/bingo/bongo/JavaFunctions");
jmethodID constructor = (*env)->GetMethodID(env, instanceClass, "<init>", "()V");
instance = (*env)->NewObject(env, instanceClass, constructor);
methodId = (*env)->GetMethodID(env, instanceClass, "sum", "(II)I");
}
void createJVM() {
hvm = LoadLibrary("c:\\programmi\\java\\jre\\bin\\client\\jvm.dll");
FARPROC createJVM = GetProcAddress(hvm, "JNI_CreateJavaVM");
JavaVMInitArgs vmArgs;
vmArgs.version = 0x00010002;
vmArgs.nOptions = 0;
(*createJVM)(&jvm, (void**)&env, &vmArgs);
}
void disposeJVM() {
if(jvm != NULL) (*jvm)->DestroyJavaVM(jvm);
if(hvm != NULL) FreeLibrary(hvm);
}
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#10 | ||
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Quote:
Non so se c'e' una JNI gia' managed per C#, ora cerco. Alla peggio prendo il tuo codice C++ royalty free (
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 14-06-2009 alle 09:51. |
||
|
|
|
|
|
#11 | |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:26.






















