Pregunta

He encontrado muchas referencias en línea (incluyendo algunos en stackoverflow) a JNA siendo utilizados para las bibliotecas de C ++, pero nada que pueda encontrar en la documentación del JNA indica que es posible. No parece haber ninguna manera de terminar una clase de C ++, en particular.

Necesito acceso nativo a utilizar RTAudio, pero todas las funciones del RTAudio son funciones miembro de la clase RTAudio. Así sólo para confirmar, JNA no es la manera de ir a la derecha?

¿Fue útil?

Solución

Lo que esta pregunta equivale a está pidiendo cómo llamar a métodos C ++ utilizando JNA , y es posible, pero vas a tener que hacer algún trabajo. En particular, tendrá que escribir un envoltorio que extern "C"s cualquiera de las funciones que realmente necesita para invocar.

Para cualquier definición type* function() arbitraria puede asignar el método que utiliza JNA como devolver un com.sun.jna.Pointer, pero no será capaz de invocar métodos en el objeto un C ++ de JNA.

Una solución simple para esto sería escribir una biblioteca de interfaz de C que simplemente invoca el método en los objetos para usted ... así que si usted tiene alguna función miembro foo() puede exportar un método C a partir del código C ++:

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

Obviamente esto va a añadir un poco de trabajo para usted ... pero sospecho que los gastos generales para el cambio a JNI sería de alrededor de la misma.

JNA sólo se preocupa por la forma en que se exporta el método en el archivo DLL - y que debe ser sin C ++ decoraciones (de ahí el extern "C"), por lo que puede hacer lo que sea necesario dentro de cualquier tal método, sin exponer los métodos de los que se llama.

En mi ejemplo contribuido anteriormente, esto significa que foo(), siempre que se define dentro de la DLL de hecho no tienen que estar expuestos aún. Ya que es una función de C ++, JNA no puede llamar directamente, pero puede ser llamada desde dentro de una función que puede llamar JNA, que es por eso que mi solución propuesta funciona.

Así que, sí, se puede encapsular totalmente las llamadas a todas las funciones miembro (crear, operar, destruir) en una sola función y JNA no la atención.

Otros consejos

Trate trago . Se va a crear contenedores para C ++ clases para usted.

BridJ es un hijo espiritual del JNA que añade soporte alguna limitada C ++ (+ apoyo total de JNAerator ). Si usted no está utilizando demasiadas plantillas que sólo podría funcionar ...

(exención de responsabilidad: Soy el autor de BridJ y JNAerator)

Usted es JNA derecha es para accesing bibliotecas nativas. Creo que lo que necesita es un Java - Puente COM. Si este es el caso, hay algunas alternativas gratuitas:

http://sourceforge.net/projects/jcom

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

He usado Jacob en el pase, con buenos resultados, pero yo creo que es un poco anticuado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top