Manera rápida (en términos de tiempo de desarrollador) de usar una gran cantidad de código C++ de Java

StackOverflow https://stackoverflow.com/questions/1534734

Pregunta

Fondo:Estamos diseñando una aplicación de física que realizará una gran cantidad de análisis de datos, pero nuestro enfoque es integrar equipos electrónicos físicos.

Básicamente me gustaría poder llamar raíz (es una biblioteca de análisis de big data del CERN escrita en C++) biblioteca escrita en biblioteca C++ de Java.Básicamente, la capacidad de usar clases ROOT de Java (y hacerlo sin perder mucho tiempo codificando envoltorios JNI) es una gran ventaja para nosotros (si será difícil, lo más probable es que usemos Qt).

Puedo pensar en los siguientes métodos

  • JNI, como dije, no queremos escribir contenedores para cada clase...
  • JNA - JNA no proporciona asignaciones de C++, solo C.
  • TRAGO - No lo usé, pero escuché que es difícil de usar.

Otras cosas que pueden ser reveladoras:Tenemos acceso al código fuente raíz, pero no queremos cambiarlo.Queremos que los resultados sean portátiles.Nos gustaría limitarnos a las bibliotecas gratuitas.Y como dije, podríamos usar gran parte del código ROOT desde el principio, sin problemas.

¿Fue útil?

Solución

Con cualquier elección, vas a tener que hacer un poco de envoltura. Mientras que usted no desea escribir envoltorios JNI para cada clase, se podría escribir más alto nivel de clases de C ++ que abarcan grupos de métodos. Entonces sólo tiene que escribir contenedores para las clases de nivel superior (este enfoque funciona para otros métodos también, no sólo JNI).

Otros consejos

Escribir una pequeña aplicación de C ++ que se lee en la entrada de la entrada estándar y escribe una salida a la salida estándar. A continuación, ejecute el proceso desde la aplicación Java y leer la salida de la salida estándar.

Esta es la mejor manera de hacerlo sin JNI (y es bastante fácil de hacer)

Yo recomendaría de Dropbox genio generación de interfaz de la herramienta . Lo usan para su multi-plataforma de aplicaciones móviles para generar las interfaces entre el Java (Android) y la interfaz de Objective-C (IOS) y sus C ++ modelo de datos.

Facebook utiliza también para una de sus aplicaciones. Así que yo supongo, es bastante bien probado.

ver a su charla en CppCon para una visión general de lo que hace. La interconexión entre Java y C ++ utilizando JNI parece especialmente propenso a errores.

JNIEasy admite la asignación de clases de C ++ para las clases de Java POJO pero cuesta 399 €. Puesto que usted prefiere bibliotecas libres es posible que desee buscar soluciones que utilizan algo así como CORBA. Es la única manera de tener clases de C ++ asignados a las clases de Java.

EDIT:? ¿Ha considerado JAS3 , es una biblioteca de Java similar a raíz

Es sólo una idea, pero se puede usar Python desde la raíz ya es compatible con ella? Es posible que así convertirse razonablemente competentes en el tiempo que tomaría para envolver el código para Java.

Considere el uso de C # en lugar de Java. Si ya está familiarizado con Java, el cambio a C # es fácil y tiene mucho mejor soporte para invocar a código nativo.

¿Qué hay de escribir las clases / funciones que necesita en C ++, compilar y llamar a exec () sobre ellos desde java?

Siempre que llamas código C o C++ desde Java a través de JNI o ​​equivalente, corres el riesgo de desestabilizar la plataforma Java debido a problemas con la administración de memoria y/o la seguridad de subprocesos en el lado C/C++.

Antes de seguir la ruta JNI, etc., creo que deberías considerar otras alternativas:

  • Elimine Java de la ecuación e impleméntelo completamente en C++ (o C++/CC# como sugirió alguien más).
  • Cree una aplicación de línea de comandos C++ que realice la tarea que necesita realizar utilizando la biblioteca nativa y ejecute la aplicación utilizando uno de los java.lang.Runtime.exec métodos.
  • Cree un contenedor de "servidor" en C++ para la biblioteca que exponga la funcionalidad que necesita como protocolo personalizado y codifique el lado de Java para comunicarse con el servidor mediante HTTP, sockets sin formato, canalizaciones o cualquier nivel de transporte que sea apropiado.

Todas las alternativas tienen desventajas, pero también las tienen JNI/JNA y similares;ver el primer párrafo.

EDITAR:Cuando se toma la decisión de utilizar JNI/JNA en un sistema, es probable que haya consecuencias a largo plazo.Además del problema de estabilidad, debe considerar la portabilidad (la biblioteca nativa funcionará en Windows, Linux, etc.), problemas de compilación (es difícil crear bibliotecas nativas en Ant, etc.), problemas de versiones de la plataforma (se actualizará a Java). 7 ¿romper algo?), habilidades de desarrollador ("Joe", quien hizo la integración de JNI, se fue; ¿quién más conoce Java, C++ y JNI?).La suma de estas cuestiones es (en mi opinión) más significativa que el tiempo necesario para realizar el desarrollo inicial.

si va a ser difícil, lo más probable que estaremos usando Qt

¿Por qué no te centras en eso? Hasta el momento no se ha mencionado alguna razón por la Java se debe preferir.

Si la parte más grande es el root fuente y el código que llama se le probablemente mucho más rápido haciendo todo en C ++.
Como estás bien con Qt, la interfaz de usuario no debe ser mucho de qué preocuparse.

editar
Realmente no puedo ver ninguna ventaja a la Java-enfoque -. Tienes que portar una gran parte de la fuente a otras plataformas de todos modos, se agrega en la complejidad con la capa de envoltura y tiene más dependencias

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