Come posso richiamare Foo :: print da Java in modo che l'output venga visualizzato in uscita?
Concettualmente parlando, il modo per ottenere Foo :: print (...) di scrivere a un'istanza Java OutputStream esistente è quello di scrivere un'implementazione std :: ostream C++ che fa in realtà un callback in Java per fare uscita .
Sembra possibile, ma non vorrei scrivere/mantenere il codice. In fase di esecuzione, le chiamate passano da Java -> C++ -> Java, e ci sono molte opportunità per commettere errori che causeranno il blocco casuale della JVM.
C'è un modo per costringere il OutputStream ad uno std :: ostream nello strato JNI?
AFAIK n.
Posso catturare l'output in un buffer lo strato JNI e quindi copiarlo in fuori?
Intendi qualcosa di simile a questo?
MyJNIThing m = ...
int myOstream = m.createMemoryBackedOStream(...); // native method
...
m.someMethodWrapper(... myOStream); // native method
...
byte[] data = m.getCapturedData(myOStream); // native method
out.write(data);
Probabilmente si può fare una cosa del genere ... il lavoro in una buona giornata con un vento in poppa.
Ma penso che dovresti davvero mirare ad eliminare il codice C++ piuttosto che cercare di fare cose sempre più complicate attraverso JNI. IMO, JNI dovrebbe essere usato solo come ultima risorsa, e non una scorciatoia per evitare la ricodifica di roba in Java.
fonte
2009-09-16 22:49:26
Reimplementare la libreria in Java non è un'opzione (è ampia, matura e ad alte prestazioni). –
Forse non dovresti provare a chiamarlo da Java allora. Il mio punto è che è probabile che crei molto dolore per te stesso e per le persone che devono mantenere il tuo codice. –
Mentre sono d'accordo, il codice JNI è difficile dire che si dovrebbe assolutamente evitare che non sia giusto. C'è sicuramente una Place for JNI, in particolare con grandi progetti legacy come l'op menzionato e nel mio caso le API di terze parti che devi usare per portare a termine il lavoro. Questa è una domanda molto valida, anche io cerco una risposta. – Cliff