Sembra che la maggior parte delle librerie di documentazione o di supporto relative a JNI (Java Native Interface) riguardino la chiamata di codice nativo da Java. Questo sembra essere l'uso principale di questo, anche se è capace di più.Cercare un modo conveniente per chiamare Java da C++
Voglio principalmente lavorare nella direzione opposta: modificare un programma C++ portatile (abbastanza grande) esistente aggiungendo alcune librerie Java ad esso. Ad esempio, voglio farlo chiamare database via JDBC, o sistemi di code di messaggi tramite JMS, o inviare e-mail, o chiamare le mie classi Java, ecc. Ma con JNI raw questo è piuttosto spiacevole e soggetto a errori.
Quindi preferirei scrivere codice C++ che possa chiamare le classi Java con la stessa facilità con cui C++/CLI può chiamare le classi CLR. Qualcosa di simile:
using namespace java::util::regex; // namespaces mapped
Pattern p = Pattern.compile("[,\\s]+");
array<java::lang::String> result =
p.split("one,two, three four , five");
for (int i=0; i < result.length(); i++)
std::cout << result[i] << std::endl;
In questo modo, non avrebbe dovuto manually do the work of getting the method ID by passing the name and the weird signature strings, e sarebbe al riparo da errori di programmazione causati dai API incontrollati per chiamare i metodi. In effetti assomiglierebbe molto all'equivalente Java.
NB. SONO ANCORA PARLIAMO DI USARE JNI! Come tecnologia di base è perfetta per le mie esigenze. È "in corso" ed estremamente efficiente. Non voglio eseguire Java in un processo separato e fare chiamate RPC ad esso. JNI stessa va bene. Voglio solo una piacevole interfaccia ad esso.
Dovrebbe esserci uno strumento di generazione del codice per rendere equivalenti classi C++, spazi dei nomi, metodi, ecc. Per far corrispondere esattamente ciò che è esposto da un insieme di classi Java che specifichi. Le classi C++ generate sarebbero:
- Hanno funzioni membro che accettano versioni simili dei loro parametri e quindi eseguono il necessario voodoo JNI per effettuare la chiamata.
- Avvolgere i valori di ritorno nello stesso modo in modo da poter concatenare le chiamate in modo naturale.
- Mantenere una cache statica per classe di ID metodo per evitare di cercarli ogni volta.
- Essere totalmente thread-safe, portatile, open source.
- Controlla automaticamente le eccezioni dopo ogni chiamata al metodo e genera un'eccezione C++ std.
- Funziona anche quando sto scrivendo i metodi nativi nel solito modo JNI, ma ho bisogno di chiamare su altro codice Java.
- L'array deve funzionare in modo totalmente coerente tra tipi e classi primitivi.
- Avrà sicuramente bisogno di qualcosa di simile al globale per racchiudere i riferimenti quando devono sopravvivere al di fuori di una cornice di riferimento locale - di nuovo, dovrebbe funzionare allo stesso modo per tutti i riferimenti di matrice/oggetto.
Esiste o una libreria portatile e open source, o sto sognando?
Nota: ho trovato this existing question ma l'OP in quel caso non era quasi come esigente di perfezione come mi viene ...
Aggiornamento: un commento su SWIG mi ha portato a this previous question, che sembra indicare che è principalmente nella direzione opposta e quindi non farebbe quello che voglio.
IMPORTANTE
- Qui si tratta di essere in grado di scrivere codice C++ che manipola le classi e gli oggetti Java, non il contrario (vedi il titolo!)
- so già che JNI esistente (vedere la domanda!) Ma il codice scritto a mano per le API JNI è inutilmente prolisso, ripetitivo, soggetto a errori, non controllato in fase di compilazione, ecc. Se si desidera memorizzare gli ID metodo e gli oggetti classe è ancora più dettagliato. Voglio generare automaticamente classi wrapper C++ che si occupino di tutto ciò per me.
Aggiornamento: ho iniziato a lavorare sulla mia propria soluzione:
https://github.com/danielearwicker/cppjvm
Se questo esiste già, per favore fatemelo sapere!
NB. Se stai pensando di usarlo nel tuo progetto, sentiti libero, ma tieni a mente che in questo momento il codice ha poche ore di vita, e ho scritto solo tre test molto non complicati finora.
C'è [SWIG] (http://www.swig.org/Doc1.3/Java.html) anche se l'ho usato solo per C e Python ... un * lungo * tempo fa. –
Vedi aggiornamento: SWIG a quanto pare non lo fa. –
in quale compilatore/interprete vuoi eseguire il tuo programma, C o Java? Se Java, il reverse non è possibile usando JNI. – Naved