thomas programación programacion orientada objetos libro introducción fundamentos desde definicion con codigos cero java c translation

programación - ¿Cuál es la forma más fácil de usar el código fuente C en una aplicación Java?



manual de programacion android pdf (7)

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

Una vez que 64 bit se vuelve un poco más común, también deberá comenzar a compilar / implementar versiones de 32 bit y 64 bit de la biblioteca. 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.

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 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é traduciendo la parte de la biblioteca que necesitaba para 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.


¿Has intentado usar:

System.loadLibrary("mylibrary.dll");

No estoy seguro de si esto funcionará con una biblioteca C pura, pero probablemente valga la pena intentarlo. :)


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 se pueden traducir 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 cual 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.


En el proyecto de la Biblioteca Científica Java GNU 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.


Lo compilaría y usaría JNA.

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

No sé sobre su rendimiento o usabilidad en su caso, pero lo probaría.


Su mejor opción es, probablemente, tomar un buen libro c (K & R: The C Programming language) una taza de té y comenzar 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 que la forma JNI es posible, en cuanto al compilador de ca, probablemente podría usar ''Bloodshead Dev-c ++'', pero es un gran esfuerzo para ~ 5000 líneas.


De hecho, JNA se ve impresionante, requiere menos esfuerzo que directamente el uso 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.