Il modo consigliato è leggere attentamente la documentazione JNI ufficiale .
(Dichiarazione di non responsabilità: la mia descrizione di seguito potrebbe contenere errori).
Ciò non richiede uno, ma due strati di wrapper (item 2 e 3):
- Codice applicazione Java
- Classi di wrapper Java JNI (per fornire un modello di oggetto alla libreria)
- C wrapper JNI (per il marshalling dei dati tra ambiente JNI e codice C / C ++)
- Codice libreria C ++
Il wrapper C JNI è responsabile dell'accesso agli array, alle stringhe, ai campi dei membri degli oggetti, ecc. di Java. Ciò è necessario perché Java può spostarsi tra array e oggetti nella memoria, come parte della garbage collection. In un certo senso, il codice C non può accedere a nulla nell'ambiente Java a meno che non ottenga un riferimento (che indica la vita della cosa alla VM). Anche così, si possono ottenere solo gli indirizzi degli array se l'array e il supporto VM si bloccano (essendo appuntati al suo indirizzo di memoria corrente). In caso contrario, ogni accesso ai dati Java richiede la copia e questa copia può essere eseguita solo con l'aiuto di JNI.
La funzione C JNI non può essere una funzione membro della classe, in base alla progettazione. Per poter chiamare le funzioni membro dell'oggetto C ++, il metodo C JNI deve ottenere l'indirizzo dell'oggetto C ++ (in genere archiviato come un campo intero a 32 o 64 bit nella classe wrapper JNI Java) e inserirlo nel C ++ puntatore dell'oggetto.
I maggiori problemi sono:
-
È difficile per i generatori di wrapper generare un modello di oggetto Java soddisfacente dato il codice C / C ++, indipendentemente dal fatto che quest'ultimo sia stato scritto in uno stile OOP. I generatori di wrapper scritti nell'ultimo decennio non comprendono gli stili C / C ++ abbastanza profondi da essere in grado di riconoscere gli idiomi OOP. (La maggior parte potrebbe anche non riuscire ad analizzare il codice C / C ++ legale, a causa della complessità della sintassi del linguaggio.)
-
Un wrapper-scrittore umano farà molti adattamenti di stile tra le due lingue. Fino a poco tempo fa, era difficile imitare tali preferenze (che non sono meccaniche e non dirette) nei generatori di wrapper.
Dai anche un'occhiata