Qual è il modo più semplice per utilizzare il codice sorgente C in un'applicazione Java?

StackOverflow https://stackoverflow.com/questions/83299

  •  01-07-2019
  •  | 
  •  

Domanda

Ho trovato questa libreria open source che desidero utilizzare nella mia applicazione Java.La libreria è scritta in C ed è stata sviluppata sotto Unix/Linux e la mia applicazione funzionerà su Windows.È una libreria di funzioni per lo più matematiche, quindi per quanto ne so non utilizza nulla che dipenda dalla piattaforma, è solo codice C molto semplice.Inoltre, non è così grande, meno di 5.000 righe.

Qual è il modo più semplice per utilizzare la libreria nella mia applicazione?So che esiste JNI, ma ciò implica trovare un compilatore per compilare la libreria sotto Windows, aggiornarsi con il framework JNI, scrivere il codice, ecc.Fattibile, ma non così facile.Esiste un modo più semplice?Considerando le dimensioni ridotte della libreria, sono tentato di tradurla semplicemente in Java.Ci sono strumenti che possono aiutare in questo?


MODIFICARE

Ho finito per tradurre in Java la parte della libreria di cui avevo bisogno.Per ora rappresenta circa il 10% della biblioteca, anche se probabilmente aumenterà con il tempo.C e Java sono abbastanza simili, quindi ci sono volute solo poche ore.La difficoltà principale è correggere i bug introdotti da errori nella traduzione.

Grazie a tutti per il vostro aiuto.Le soluzioni proposte mi sono sembrate tutte interessanti e le esaminerò quando avrò bisogno di collegarmi a biblioteche più grandi.Per un piccolo pezzo di codice C, la traduzione manuale era la soluzione più semplice.

È stato utile?

Soluzione

La soluzione migliore è probabilmente prendere un buon libro in formato C (K&R:Il linguaggio di programmazione C) una tazza di tè e inizia a tradurre!Sarei scettico riguardo alla fiducia in un programma di traduzione, molto spesso il miglior traduttore non sei tu stesso!Se lo fai, allora è fatto e non è necessario continuare a rifarlo.Potrebbero esserci alcune complicazioni se la libreria è open source, dovrai controllare attentamente la licenza a riguardo.Un altro punto da considerare è che ci sarà sempre qualche elemento di rischio e potenziale errore nella traduzione, quindi potrebbe essere necessario prendere in considerazione la possibilità di scrivere alcuni test per garantire che la traduzione sia corretta.

Non esistono funzioni matematiche equivalenti a JAVA?

Come tu stesso commenti, il modo JNI è possibile, poiché per un compilatore c potresti probabilmente usare 'Bloodshead Dev-c++' potrebbe funzionare, ma è un grande sforzo per ~ 5000 righe.

Altri suggerimenti

Sul Biblioteca scientifica Java GNU progetto che ho usato Sorseggia per generare le classi wrapper JNI attorno alle librerie C.Ottimo strumento e può anche generare codice wrapper in diversi linguaggi incluso Python.Altamente raccomandato.

Lo compilerei e userei JNA.

JNA (Java Native Access) fondamentalmente fa in runtime ciò che JNI in fase di compilazione e non ha bisogno di alcun codice non Java (nemmeno molto Java).

Non conosco le sue prestazioni o l'usabilità nel tuo caso, ma ci proverei.

Sei sicuro di voler utilizzare la libreria C, anche se è così piccola?

Una volta che il 64 bit diventerà un po' più comune, dovrai iniziare a creare/distribuire anche le versioni a 32 bit e 64 bit della libreria.E a seconda di come è il codice C, potrebbe essere necessario o meno aggiornare il codice per renderlo compilabile a 64 bit.

Se la libreria C è semplice, potrebbe essere più semplice eseguire il porting della libreria C su Java puro e non doversi occupare della creazione/distribuzione di una libreria JNI, della libreria C e del codice Java.

Bene, c'è AMPC.È un compilatore C per Windows, MacOS X e Linux, in grado di compilare codice C in Java Byte Code (il tipo di codice che viene eseguito su una macchina virtuale Java).

AMPC

Tuttavia, è commerciale e costa $ 199 per licenza.Dubito che questo ti ripaghi ;) Non conosco nessun compilatore gratuito del genere.

OTOH, Java e C sono abbastanza simili.Probabilmente potresti rifattorizzare il codice C in Java (le strutture possono essere sostituite con oggetti con variabili di istanza pubbliche) e le operazioni del puntatore possono solitamente essere tradotte in qualcos'altro (operazioni sugli array per esempio).Anche se immagino che tu non voglia leggere 5.000 righe di codice, vero?

L'uso di JNI rende il codice dipendente dalla piattaforma, tuttavia se dici che è C indipendente dalla piattaforma, non c'è motivo per cui il tuo codice Java dovrebbe essere dipendente dalla piattaforma.OTOH, a seconda di quanto siano costosi questi calcoli, l'utilizzo di JNI potrebbe effettivamente offrirti un miglioramento delle prestazioni, poiché quando si tratta di throughput di calcolo dei numeri grezzi, C può comunque battere Java in velocità.Tuttavia le chiamate JNI sono molto costose, quindi se il calcolo è solo molto semplice e veloce, la chiamata JNI stessa potrebbe richiedere lo stesso tempo (o anche di più) del calcolo eseguito, nel qual caso l'utilizzo di JNI non ti porterà nulla, ma un rallentamento giù l'app e causando un sovraccarico della memoria.

In effetti, JNA sembra impressionante e richiede meno sforzo rispetto all'utilizzo diretto di JNI.Ma in ogni caso perderesti l'indipendenza dalla piattaforma, e poiché probabilmente ne usi solo una piccola parte, potresti prendere in considerazione l'idea di tradurre ciò di cui effettivamente hai bisogno.

Hai provato a utilizzare:

System.loadLibrary("mylibrary.dll");

Non sono sicuro che funzionerà con una libreria C pura, ma probabilmente vale la pena provarci.:)

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