Ciò che questa domanda equivale a chiedere how to call C++ instance methods using JNA, ed è possibile, ma si dovrà fare un po 'di lavoro. In particolare, è necessario scrivere un wrapper con le funzioni extern "C"
che è effettivamente necessario richiamare.
Per qualsiasi definizione arbitraria di type* function()
è possibile mappare il metodo utilizzando JNA restituendo un valore com.sun.jna.Pointer
, ma non sarà possibile richiamare i metodi su un oggetto C++ da JNA.
Una soluzione semplice per questo sarebbe di scrivere una libreria di interfaccia C che invoca semplicemente il metodo sugli oggetti per voi ... quindi se avete qualche funzione membro foo()
si potrebbe esportare un metodo di C dal codice C++:
Ovviamente questo aggiungerà un po 'di lavoro per voi ... ma ho il sospetto che il sovraccarico per il passaggio a JNI sarebbe più o meno lo stesso.
JNA si preoccupa solo il modo in cui il metodo viene esportata nella DLL - e che deve essere senza C++ decorazioni (da qui il extern "C"
), in modo da poter fare tutto ciò che è necessario all'interno di tale metodo senza esporre metodi che chiami.
Nel mio esempio precedente, questo significa che foo()
, a condizione che sia definito all'interno della DLL, non deve essere nemmeno 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ì, è possibile incapsulare completamente le chiamate a tutte le funzioni membro (creare, utilizzare, distruggere) in un'unica funzione e JNA non si preoccuperà.
fonte
2010-02-11 04:48:09
Grande risposta, grazie.Se un metodo C regolare crea l'istanza della classe C++ all'interno del corpo della funzione, chiama la funzione membro e quindi elimina l'oggetto, è possibile evitare direttamente l'associazione delle funzioni membro? O JNA in qualche modo "sa" e rifiuta ciò che altrimenti sembra essere una funzione C ma che usa il C++ nei loro corpi? –
@carneades: è necessario più spazio di quanto consentito dai commenti, vedere la mia modifica nel post. –
Grazie Mark, ha funzionato perfettamente! extern "C" void rtattempt (void) { RtAudio :: audio RtAudio; std :: cout << "num devices:" << audio.getDeviceCount() << std :: endl; } –