Domanda

Sfondo:Stiamo progettando un'app di fisica, che effettuerà molte analisi dei dati, ma il nostro obiettivo è integrare apparecchiature elettroniche fisiche.

Fondamentalmente vorrei poter chiamare radice (è una libreria di analisi di big data del CERN scritta in C++) libreria scritta in C++ libreria da Java.Fondamentalmente la capacità di utilizzare le classi ROOT da Java (e di farlo senza perdere molto tempo per codificare i wrapper JNI) è un ostacolo per noi (se sarà difficile, molto probabilmente utilizzeremo Qt).

Posso pensare ai seguenti metodi

  • JNI - come ho detto - non vogliamo scrivere i wrapper per ogni classe...
  • JNA - JNA non fornisce mappature C++, ma solo C.
  • SWIG - Non l'ho usato, ma ho sentito che è difficile da usare.

Altre cose che potrebbero essere rilevanti:abbiamo accesso al codice sorgente root, ma non vogliamo cambiarlo.Vogliamo che i risultati siano portatili.Vorremmo attenerci alle biblioteche gratuite.E come ho detto, saremmo in grado di utilizzare gran parte del codice ROOT fin dall'inizio, senza problemi.

È stato utile?

Soluzione

Con qualsiasi scelta, si sta andando ad avere bisogno di fare un po 'di avvolgimento. Anche se non si desidera scrivere wrapper JNI per ogni classe, si può scrivere più alto livello di classi C ++ che comprendono gruppi di metodi. Allora avete solo bisogno di scrivere wrapper per le classi di livello superiore (questo approccio funziona per altri metodi di troppo, non solo JNI).

Altri suggerimenti

Scrivi una piccola applicazione C ++ in cui si legge nel vostro input da stdin e scrive un output sullo standard output. Quindi eseguire il processo dall'interno java app e leggere l'output da stdout.

Questo è il modo migliore per farlo senza JNI (ed è abbastanza facile da fare)

djinni generazione dell'interfaccia strumento di Dropbox. L'usano per la loro cross-platform applicazioni mobili per generare le interfacce tra il Java (Android) e l'interfaccia di Objective-C (iOS) e il loro C ++ modello di dati.

Facebook utilizzato troppo per una delle loro applicazioni. Così mi piacerebbe pensare, è piuttosto ben collaudato.

vedere il loro intervento al CppCon per una panoramica di ciò che fa. Interfacciamento tra Java e C ++ utilizzando JNI sembra particolarmente soggetto a errori.

JNIEasy supporta il mapping di classi C ++ alle classi Java POJO ma costa 399 €. Dal momento che si preferisce librerie libere si potrebbe voler cercare soluzioni che utilizzano qualcosa come CORBA. È l'unico modo per avere classi C ++ mappati classi Java.

EDIT:? Avete considerato JAS3 , è una libreria Java simile a root

Solo un pensiero, ma si può usare Python dal Root supporta già vero? Si potrebbe anche diventare ragionevolmente abile nel tempo che ci vuole per avvolgere il codice per Java.

Si consiglia di utilizzare C #, invece di Java. Se sei già familiarità con Java, il passaggio a C # è facile e ha molto meglio supporto per invocare codice nativo.

Che dire di scrivere le classi / funzioni necessarie in C ++, compilazione, e chiamando exec () su di loro da Java?

Ogni volta che chiami codice C o C++ da Java tramite JNI o ​​equivalente, corri il rischio di destabilizzare la piattaforma Java a causa di problemi con la gestione della memoria e/o la sicurezza dei thread sul lato C/C++.

Prima di seguire il percorso JNI, ecc., penso che dovresti considerare altre alternative:

  • Togli Java dall'equazione e implementalo interamente in C++ (o C++/CC# come suggerito da qualcun altro).
  • Crea un'applicazione da riga di comando C++ che svolga l'attività che devi eseguire utilizzando la libreria nativa ed esegui l'applicazione utilizzando uno dei java.lang.Runtime.exec metodi.
  • Crea un wrapper "server" in C++ per la libreria che esponga la funzionalità di cui hai bisogno come protocollo personalizzato e codifica il lato Java per comunicare con il server utilizzando HTTP, socket non elaborati, pipe o qualsiasi livello di trasporto appropriato.

Tutte le alternative hanno degli svantaggi, ma anche JNI/JNA e simili;vedere il primo paragrafo.

MODIFICARE:quando si decide di utilizzare JNI/JNA in un sistema, è probabile che vi siano conseguenze a lungo termine.Oltre al problema di stabilità, devi considerare la portabilità (la libreria nativa funzionerà su Windows, Linux, ecc.), problemi di creazione (è difficile creare librerie native in Ant, ecc.), problemi relativi alle versioni della piattaforma (aggiornamento a Java 7 rompere qualcosa?), competenze di sviluppatore ("Joe" che ha lasciato l'integrazione JNI - chi altro conosce Java, C++ e JNI?).La somma di questi problemi è (IMO) più significativa del tempo necessario per eseguire lo sviluppo iniziale.

se sarà difficile, molto probabilmente useremo Qt

Perché non concentrarsi su questo? Finora non è stato menzionato i motivi per cui Java dovrebbe essere preferito.

Se la parte più grande è il root sorgente e il codice che chiama vi sarà probabilmente molto più veloce di fare tutto in C ++.
Come si sono ok con Qt, l'interfaccia utente non dovrebbe essere molto di cui preoccuparsi.

modifica:
Non riesco a vedere alcun vantaggio al Java approccio -. Dovete porta una grande parte della sorgente ad altre piattaforme in ogni caso, si aggiunge la complessità con lo strato di avvolgimento e si dispone di più dipendenze

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top