2008-09-17 16 views
9

Encontré esta biblioteca de código abierto que quiero usar en mi aplicación Java. La biblioteca está escrita en C y fue desarrollada bajo Unix/Linux, y mi aplicación se ejecutará en Windows. Es una biblioteca de funciones principalmente matemáticas, por lo que puedo decir que no usa nada que dependa de la plataforma, es solo un código C muy básico. Además, no es tan grande, menos de 5,000 líneas.¿Cuál es la forma más fácil de usar el código fuente C en una aplicación Java?

¿Cuál es la forma más fácil de usar la biblioteca en mi aplicación? Sé que hay JNI, pero eso implica encontrar un compilador para compilar la biblioteca en Windows, actualizarse con el marco JNI, escribir el código, etc. Es factible, pero no tan fácil. hay una manera mas facil? Teniendo en cuenta el pequeño tamaño de la biblioteca, estoy tentado de simplemente traducirlo a Java. ¿Hay alguna herramienta que pueda ayudar con eso?


EDITAR

terminé la traducción de la parte de la biblioteca que tenía que Java. Hasta ahora, se trata de un 10% de la biblioteca, aunque probablemente aumentará con el tiempo. C y Java son bastante similares, por lo que solo tomó unas pocas horas. La principal dificultad es solucionar los errores que introducen los errores en la traducción.

Gracias a todos por su ayuda. Todas las soluciones propuestas parecían interesantes y las examinaré cuando necesite vincularlas a bibliotecas más grandes. Para un pequeño fragmento de código C, la traducción manual fue la solución más simple.

+0

Antes de continuar con su aplicación, eche un vistazo a la [Documentación de la API de la Biblioteca de Matemáticas Apache Commons] (http://commons.apache.org/math/api-1.2/index.html) –

Respuesta

5

Su mejor opción es probablemente tomar un buen libro c (K & R: The C Programming language) una taza de té y empezar a traducir! Sería escéptico acerca de confiar en un programa de traducción, ¡con más frecuencia, entonces el mejor traductor es usted mismo! Si haces esto, entonces está hecho y no necesitas seguir repitiéndolo. Puede haber algunas complicaciones si la biblioteca es de código abierto, necesitará verificar cuidadosamente la licencia al respecto. Otro punto a considerar es que siempre habrá algún elemento de riesgo y posible error en la traducción, por lo que podría ser necesario considerar la posibilidad de escribir algunas pruebas para garantizar que la traducción sea correcta.

¿No hay funciones matemáticas JAVA equivalentes?

Como usted mismo comenta la forma JNI es posible, como para un compilador c probablemente podría usar 'Bloodshead Dev-C++' podría funcionar, pero es un gran esfuerzo para ~ 5000 líneas.

4

Lo compilaría y usaría JNA.

JNA (Java Native Access) es básicamente lo que hace JNI en tiempo de compilación en tiempo de compilación y no necesita ningún código que no sea java (tampoco mucho java).

No sé acerca de su rendimiento o facilidad de uso en su caso, pero lo probaría.

+0

No he tocado java en años, pero pensé que se llamaba JNI-Java Native Interface. Avíseme si cambiaron el nombre. –

+1

@ManVsCode es posible que desee eliminar esa observación, no tiene sentido. Vuelve a leer la respuesta. –

11

En el proyecto Java GNU Scientific Library utilicé Swig para generar las clases de contenedor JNI alrededor de las bibliotecas C. Gran herramienta, y también puede generar código contenedor en varios idiomas, incluido Python. Muy recomendable.

-2

¿Ha intentado utilizar:

System.loadLibrary("mylibrary.dll"); 

No estoy seguro si esto va a funcionar con una biblioteca de C puro, pero es probable que sea digno de un tiro. :)

+1

¿Y qué hacer qué? – dmeister

0

De hecho, JNA se ve impresionante, requiere menos esfuerzo que el uso directo de JNI.Pero en cualquier caso perderás la independencia de la plataforma, y ​​como probablemente solo uses una pequeña parte de ella, podrías considerar traducir lo que realmente necesitas.

0

Bueno, hay AMPC. Es un compilador de C para Windows, MacOS X y Linux, que puede compilar el código C en Java Byte Code (el tipo de código que se ejecuta en una máquina virtual Java).

AMPC

Sin embargo, es comercial y cuesta $ 199 por licencia. Dudo que sea rentable para ti;) No conozco ningún compilador gratuito como ese.

OTOH, Java y C son bastante similares. Probablemente pueda refactorizar el Código C a Java (las estructuras pueden ser reemplazadas por objetos con variables de instancia públicas) y las operaciones con punteros generalmente pueden traducirse a otra cosa (operaciones de matriz, por ejemplo). Aunque supongo que no quieres pasar por 5.000 líneas de código, ¿verdad?

El uso de JNI hace que la plataforma de código dependa; sin embargo, si usted dice que es independiente de la plataforma C, no hay ninguna razón por la que su código Java dependa de la plataforma. OTOH, dependiendo de cuán costosos son estos cálculos, usar JNI en realidad podría comprarle una ganancia de rendimiento, ya que cuando se trata del procesamiento de crujidos de números crudos, C aún puede vencer a Java en velocidad. Sin embargo, las llamadas JNI son muy costosas, por lo que si el cálculo es solo muy rápido y simple, la llamada JN puede durar tanto tiempo (o incluso más) que el cálculo realizado, en cuyo caso usar JNI no le comprará nada, pero reducirá la velocidad baje su aplicación y cause sobrecarga de memoria.

1

¿Estás seguro de que deseas utilizar la biblioteca C, incluso si es tan pequeña?

Una vez que el bit de 64 bits se vuelve un poco más común, deberá comenzar a compilar/implementar versiones de la biblioteca tanto de 32 bits como de 64 bits. Y dependiendo de cómo sea el código C, puede o no necesitar actualizar el código para hacerlo construir como 64 bit.

Si la biblioteca C es simple, puede ser más fácil simplemente portar la biblioteca C a Java puro y no tener que lidiar con construir/desplegar una biblioteca JNI, la biblioteca C y el código java.

Cuestiones relacionadas