En lugar de JNI, o JNI con un poco de asistencia desde un generador de envoltura automática como TRAGO, o incluso JNA, es posible que considerar la separación de la C/C++ y Java en procesos separados y el uso de algún tipo de IPC y/o Java Process
abstracción para llamar a un programa escrito en C/C++. Este enfoque abandona el "envoltorio", por lo que en cierto sentido no es una respuesta a esta pregunta, pero por favor, lea antes de votar abajo. Creo que esta es una respuesta razonable al problema más amplio en algunos casos.
El motivo de este enfoque es que cuando llama a C/C++ directamente desde Java, , la JVM corre el riesgo de sufrir un error en el código nativo. El riesgo depende, en cierta medida, de la cantidad de código nativo que le pertenece y de cuánto enlaza con el código de un tercero (y la cantidad de acceso que tiene al código fuente de dicho código de terceros).
Me encontré con una situación en la que tuve que llamar a una biblioteca C/C++ desde Java y la biblioteca C/C++ tenía errores que causaban la falla de la JVM. No tenía el código fuente de un tercero, así que no pude arreglar el/los error (s) en el código nativo. La solución final fue llamar a un programa separado de C/C++, vinculado a la biblioteca de terceros. La aplicación Java luego hacía llamadas a muchos procesos nativos efímeros cada vez que necesitaba llamar a C/C++.
Si el código nativo tiene un problema, es posible que pueda recuperar/reintentar en Java. Si el código nativo está envuelto y llamado desde el proceso de JVM, podría eliminar toda la JVM.
Este enfoque tiene implicaciones en el rendimiento/consumo de recursos y puede no ser una buena opción para su aplicación, pero vale la pena considerarlo en ciertas situaciones.
Tener una aplicación por separado que ejerza la funcionalidad del código C/C++ es potencialmente útil como una utilidad independiente y para las pruebas. Y tener una línea de comando limpia o una interfaz IPC podría facilitar futuras integraciones con otros lenguajes.
Como otra alternativa, puede entrar en native signal handling para mitigar los riesgos para la integridad del proceso de JVM si lo desea y seguir con una solución de embalaje.
Su problema general no se puede resolver fácilmente; convertir cada clase de C++ de a una en clases de Java a través de JNI es bastante difícil. ¿Por qué quieres usar estas clases de C++ en Java? ¿Hay alguna razón por la que deba usar Java pero quiera la funcionalidad existente? – templatetypedef
No quiero perder la funcionalidad de mi C++. Hace ciertas funciones que Java no puede hacer por sí misma y no sé mucho cómo hacerlo todo en Java. Entonces me gustaría integrar mi C++ dentro de Java. :-) :-) –
"... Hace ciertas funciones que Java no puede hacer por sí mismo ..." - Sinceramente, cuestionaría esta afirmación. "No se puede hacer"? Evidencia, por favor. – duffymo