¿Cuál es la manera más fácil de utilizar C el código fuente de una aplicación Java?

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

  •  01-07-2019
  •  | 
  •  

Pregunta

He encontrado este de código abierto de la biblioteca que quiero usar en mi aplicación Java.La biblioteca está escrito en C y fue desarrollado bajo Unix/Linux, y mi aplicación se ejecuta en Windows.Es una biblioteca de la mayoría de las funciones matemáticas, así como de lo que puedo decir es que no uso nada de lo que es dependiente de la plataforma, es muy básica C código.Además, no es tan grande, menos de 5.000 líneas.

¿Cuál es la manera más fácil de utilizar la biblioteca en mi aplicación?Sé que hay JNI, sino que consiste en encontrar un compilador para compilar la biblioteca bajo Windows, consiguiendo hasta la fecha con la JNI marco, la escritura del código, etc.Factible, pero no es tan fácil.Hay una manera más fácil?Teniendo en cuenta el pequeño tamaño de la biblioteca, tengo la tentación de simplemente traducir a Java.Existen herramientas que pueden ayudar con eso?


EDITAR

Terminé la traducción de la parte de la biblioteca que necesitaba para Java.Es alrededor del 10% de la biblioteca hasta el momento, aunque es probable que aumente con el tiempo.C y Java son bastante similares, por lo que sólo tomó un par de horas.La principal dificultad es la fijación de los errores que se introdujo por errores en la traducción.

Gracias a todos por su ayuda.Las soluciones propuestas, todo parecía muy interesante, y voy a mirar en ellos cuando me necesitan para vincular a las bibliotecas más grandes.Para un pequeño trozo de código en C, manual de traducción fue la solución más simple.

¿Fue útil?

Solución

Su mejor apuesta es, probablemente, para agarrar un buen libro de lenguaje c (K&R:El C Progranmming idioma) una taza de té y empezar a traducir!Me gustaría ser escéptico acerca de confiar en un programa de traducción, más a menudo que no es el mejor traductor de ti mismo!Si usted hace esto, entonces su hecho y no es necesario que volver a hacerlo.Puede haber algunas complicaciones si la librería es de código abierto, tendrá que comprobar la licencia cuidadosamente acerca de esto.Otro punto a tener en cuenta es que no siempre va a ser un elemento de riesgo y potencial de error en la traducción, por tanto, podría ser necesario considerar la posibilidad de escribir algunas pruebas para asegurarse de que la traducción es correcta.

No hay JAVA equivelent de funciones Matemáticas?

Como usted mismo comentario de la JNI camino es posible, como para un compilador de c que probablemente podría utilizar 'Bloodshead Dev-c++" podría funcionar, pero es un gran esfuerzo para ~5000 líneas.

Otros consejos

En el Java de GNU Scientific Library proyecto he usado Trago para generar la JNI clases de contenedor alrededor de la C bibliotecas.Gran herramienta, y también puede generar código de contenedor en varios idiomas, incluyendo Python.Muy recomendable.

Me gustaría compilar y utilizar JNA.

JNA (Java Native Access) es básicamente hace en tiempo de ejecución qué JNI en tiempo de compilación y no necesita ningún no-código de java (no se mucho de java tampoco).

Yo no sé acerca de su uso o rendimiento en su caso, pero me gustaría darle una oportunidad.

Está seguro de que desea usar la biblioteca C, incluso si es tan pequeño?

Una vez de 64 bits se vuelve un poco más común, deberá iniciar la construcción/implementación tanto de 32 bits y las versiones de 64 bits de la biblioteca.Y dependiendo de lo que el código C es como, usted puede o no puede necesitar para actualizar el código para hacer que construir como de 64 bits.

Si la biblioteca de C es simple, puede ser más fácil de puerto de la biblioteca de C a java puro y no tener que lidiar con la construcción/implementación de un JNI de la biblioteca, la biblioteca de C y el código de java.

Así, no es de AMPC.Es un compilador de C para Windows, MacOS X y Linux, que puede compilar el código C en Java de Código de Bytes (el tipo de código que se ejecuta en una máquina virtual de Java).

De AMPC

Sin embargo, es comercial y un costo de $199 por licencia.Dudo que paga por usted ;) no sé de ningún compilador como eso.

OTOH, Java y C son bastante similares.Probablemente se puede refactorizar el Código de C a Java (estructuras pueden ser reemplazados con los objetos con el público las variables de instancia) y operaciones de puntero puede ser traducidos a otra cosa (operaciones de matriz, por ejemplo).Aunque supongo que no quieres ir a través de 5.000 líneas de código, no?

El uso de JNI hace que el código dependiente de la plataforma, sin embargo, si usted dice que esto es independiente de la plataforma C, no hay ninguna razón por la que el código de Java debe ser dependiente de la plataforma.OTOH, dependiendo de lo costoso que estos cálculos son, el uso de JNI en realidad podría comprar una ganancia de rendimiento, como cuando se trata de la cruda cálculos de rendimiento, C todavía puede derrotar a Java en velocidad.Sin embargo JNI llamadas son muy costosos, por lo que si el cálculo es muy simple, rápido cálculo, la JNI se llame a sí mismo puede tomar igual de largo (o incluso más) que el cálculo realizado, en cuyo caso el uso de JNI va a comprar nada, pero que ralentizan su aplicación y causando sobrecarga de memoria.

De hecho, JNA ve impresionante, se requiere menos esfuerzo que directamente usando JNI.Pero en cualquier caso te iba a perder la independencia de la plataforma, y dado que es probable que sólo utilizan una pequeña parte de él, usted podría considerar la posibilidad de traducir lo que realmente necesita.

Has probado a utilizar:

System.loadLibrary("mylibrary.dll");

No estoy seguro si esto va a funcionar con un puro biblioteca de C, pero es probablemente vale la pena un tiro.:)

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