2013-04-13 20 views
5

Scriverò un'applicazione server/client Java, in cui il client non è realmente un client (non ha un main), ma è una libreria.Incorpora libreria Java in C

A parte questo, devo sviluppare un modulo C (un driver di fusibili) che deve interagire con il server, quindi deve richiamare la funzione del client.

Ho fondato molti esempi di funzioni C invocate dall'applicazione Java, ma nessuno di ciò di cui ho bisogno.

Potete darmi un suggerimento o qualche suggerimento?

EDIT

perché qualcuno non riusciva a capire quello che mi serve, voglio essere più chiaro: ho un server e un programma in grado di interagire con esso solo con una libreria, scritto in Java. Il vero client è scritto in C, e deve essere in grado di richiamare le funzioni della libreria, quindi in C devo chiamare il metodo java

+0

La funzionalità che consente di chiamare il codice C da un programma Java è denominata "JNI". Puoi trovare molti esempi con una ricerca su google. –

+2

@RussellZahniser Commento assolutamente inutile, mentre sta cercando di chiamare java da c, non c da java. – BackSlash

+0

@Harlandraka: Il modulo C è chiaramente client ("interagisce con il server"), quindi ho letto "ha bisogno di richiamare la funzione del client" assumendo che "it" sia il server (Java). –

risposta

4

Ci sono essenzialmente due modi per collegare il codice C e Java; JNA e JNI.

JNA viene in genere utilizzato per interfacce banali; associazione di librerie condivise con firme appropriate per le chiamate dalla JVM alle librerie C. Alcune cose non sono fattibili con JNA da solo, specialmente le chiamate ai metodi Java e la modifica diretta degli oggetti Java sul lato C, dove si finirebbe rapidamente con un altro layer per passare le modifiche su e giù. Il punto è che la mappa dei tipi è limitata alle primitive e alcuni tipi di array (buffer/string): http://jna.java.net/javadoc/overview-summary.html#marshalling. Questo strato conterrebbe molto probabilmente un codice meno conciso, introducendo un sovraccarico aggiuntivo. Tuttavia, le chiamate da funzioni C a metodi Java sono impossibili solo con JNA.

Se è necessario chiamare i metodi Java o girare intorno agli oggetti JVM "dal basso" in C, iniziare con JNI.

Dalla domanda, presumo, che probabilmente si desidera eseguire l'intera struttura Java <> C dal lato C (nativo) anziché da una JVM. In questo caso, è necessario incorporare una JVM nella vostra applicazione C/C++ utilizzando JNI: https://stackoverflow.com/a/7506378/1175253

Come generare le intestazioni C per l'implementazione di JNI: How to generate JNI header file in Eclipse

Naturalmente, è possibile (o meglio dovrebbe) implementare JNI funzioni C con C++, semplifica la gestione delle risorse utilizzando Raii, ecc


Modifica

Programmazione con == JNI che giocano con il fuoco. Prenditi cura dei riferimenti globali sul lato C, sui thread, sul pinning della matrice, ecc. Se effettivamente devi utilizzare JNI dipende molto da cosa esattamente vuoi ottenere.

È possibile recuperare una qualsiasi classe Java nonché i relativi metodi e campi da JNIEnv rispettivamente per invocazione o modifica (proprio come il riflesso di Java). Invocare un metodo Java (JNI) nativo in questo modo potrebbe essere pericoloso. Supponendo che uno blocchi un mutex non ricorsivo all'interno dell'implementazione C, una chiamata nidificata potrebbe finire in un deadlock. Di solito si invocano metodi semplici (semplici) di Java che non sono né nativi né di proprietà propria, ma metodi nativi stessi, anche se solo per il giusto design. Il sovraccarico introdotto da JNI è trascurabile rispetto a quello che ho sperimentato nel mio recente progetto.

+0

Ok, potrebbe essere la strada. Quello che non capisco è se i metodi Java che ho bisogno di chiamare devono essere scritti usando JNI, o come semplici metodi Java, e se questa prospettiva è migliore (in termini di prestazioni, manutenibilità e, naturalmente, progettazione di argomenti) quindi usando socket – litiales

+1

@litiales Vedi modifica – Sam