Java Native Access non fa C ++, giusto?

Ho trovato molti riferimenti online (compresi alcuni su stackoverflow) a JNA utilizzato per le librerie C ++, ma nulla che possa trovare nei documenti JNA indica che è ansible. Non sembra esserci alcun modo per avvolgere una class C ++, in particolare.

Ho bisogno di un accesso nativo per usare RTAudio, ma tutte le funzioni di RTAudio sono funzioni membro della class RTAudio. Quindi, solo per confermare, JNA non è la strada giusta?

Ciò che questa domanda equivale è chiedere come chiamare i metodi di istanza C ++ usando JNA , ed è ansible, ma dovrai fare del lavoro. In particolare, dovrai scrivere un wrapper che extern "C" tutte le funzioni che hai effettivamente bisogno di invocare.

Per qualsiasi type* function() arbitraria type* function() è ansible mappare il metodo utilizzando JNA come restituendo un com.sun.jna.Pointer , ma non sarà ansible richiamare i metodi su un object C ++ da JNA.

Una soluzione semplice per questo sarebbe scrivere una libreria dell’interfaccia C che invochi semplicemente il metodo sugli oggetti per te … quindi se hai qualche funzione membro foo() puoi esportare un metodo C dal tuo codice C ++:

 extern "C" void bar(type* var){ var->foo(); } 

Ovviamente questo aggiungerà del lavoro per voi … ma sospetto che il sovraccarico per il passaggio a JNI sarebbe pressoché lo stesso.

A JNA interessa solo il modo in cui il metodo viene esportato nella DLL e questo deve essere privo di decorazioni C ++ (da cui l’ extern "C" ), quindi puoi fare tutto ciò che è necessario all’interno di qualsiasi metodo senza esporre i metodi che chiamata.

Nel mio esempio inventato sopra, questo significa che foo() , a patto che sia definito all’interno della DLL, in realtà non deve nemmeno essere esposto. Poiché è una funzione C ++, JNA non può chiamarla direttamente, ma può essere chiamata all’interno di una funzione che JNA può chiamare, ed è per questo che la mia soluzione proposta funziona.

Quindi, sì, è ansible incapsulare completamente le chiamate a tutte le funzioni membro (creare, gestire, distruggere) in una singola funzione e JNA non si preoccuperà.

Prova Swig . Creerà wrapper per le classi c ++ per te.

BridJ è un figlio spirituale di JNA che aggiunge un limitato supporto C ++ (+ supporto completo da JNAerator ). Se non stai usando troppi modelli, potrebbe funzionare …

(disclaimer: sono l’autore di BridJ & JNAerator)

Giusto JNA è per l’accesso alle librerie native. Penso che quello che ti serve sia un Java – COM Bridge. Se questo è il caso ci sono alcune alternative gratuite:

JCOM http://sourceforge.net/projects/jcom

Jacob http://sourceforge.net/projects/jacob-project

Ho usato Jacob nel passo con buoni risultati, ma penso che sia un po ‘obsoleto.