Quel est le moyen le plus simple d’utiliser le code source C dans une application Java?

J’ai trouvé cette bibliothèque open-source que je souhaite utiliser dans mon application Java. La bibliothèque est écrite en C et a été développée sous Unix / Linux, et mon application fonctionnera sous Windows. C’est une bibliothèque de fonctions principalement mathématiques, donc, autant que je sache, elle n’utilise aucun élément dépendant de la plate-forme, il s’agit simplement d’un code C très basique. En outre, ce n’est pas si grand, moins de 5 000 lignes.

Quelle est la manière la plus simple d’utiliser la bibliothèque dans mon application? Je sais qu’il existe JNI, mais cela implique de trouver un compilateur pour comstackr la bibliothèque sous Windows, de se mettre à jour avec le framework JNI, d’écrire le code, etc. C’est faisable, mais pas si facile. Y a-t-il un moyen plus facile? Compte tenu de la petite taille de la bibliothèque, je suis tenté de la traduire simplement en Java. Y at-il des outils qui peuvent aider avec ça?

MODIFIER

J’ai fini par traduire la partie de la bibliothèque dont j’avais besoin en Java. Cela représente environ 10% de la bibliothèque jusqu’à présent, même si cela augmentera probablement avec le temps. C et Java sont assez similaires, il n’a donc fallu que quelques heures. La principale difficulté consiste à corriger les erreurs introduites par des erreurs de traduction.

Merci à tous pour votre aide. Les solutions proposées semblaient toutes intéressantes et je les étudierai lorsque je devrai créer des liens vers de plus grandes bibliothèques. Pour un petit morceau de code C, la traduction manuelle était la solution la plus simple.

Votre meilleur pari est probablement de prendre une tasse de thé dans un bon livre C (K & R: Le langage de C Progranmming) et de commencer à traduire! Je serais sceptique quant à la confiance dans un programme de traduction. Le plus souvent, ce n’est pas le meilleur traducteur, c’est vous-même! Si vous faites cela, alors c’est fait et vous n’avez pas besoin de continuer à le faire. Il peut y avoir des complications si la bibliothèque est open source, vous devrez vérifier la licence attentivement à ce sujet. Un autre point à prendre en compte est qu’il y aura toujours un élément de risque et d’erreur potentielle dans la traduction. Par conséquent, il pourrait être nécessaire d’envisager de faire quelques tests pour vous assurer que la traduction est correcte.

N’y a-t-il pas de fonctions mathématiques JAVA équivalentes?

Comme vous le commentez vous-même, la méthode JNI est possible. En ce qui concerne le compilateur, vous pouvez probablement utiliser ‘Bloodshead Dev-c ++’, mais cela demande beaucoup d’efforts pour environ 5 000 lignes.

Sur le projet de bibliothèque scientifique Java GNU , j’ai utilisé Swig pour générer les classes wrapper JNI autour des bibliothèques C. Excellent outil, et peut également générer du code wrapper dans plusieurs langues, y compris Python. Hautement recommandé.

Je le comstackrais et utiliserais la JNA.

JNA (Java Native Access) est fondamentalement ce que JNI fait au moment de la compilation au moment de la compilation et ne nécessite aucun code non-java (pas beaucoup de java non plus).

Je ne sais pas à propos de ses performances ou de sa facilité d’utilisation dans votre cas, mais je l’essayerais.

Êtes-vous sûr de vouloir utiliser la bibliothèque C, même si elle est aussi petite?

Une fois que 64 bits devient un peu plus commun, vous devrez également commencer à créer / déployer les versions 32 bits et 64 bits de la bibliothèque. Et en fonction de la nature du code C, vous pouvez ou non avoir besoin de mettre à jour le code pour le comstackr en 64 bits.

Si la bibliothèque C est simple, il peut être plus facile de simplement porter la bibliothèque C en java pur et de ne pas avoir à s’occuper de la construction / déploiement d’une bibliothèque JNI, de la bibliothèque C et du code java.

Eh bien, il y a l’AMPC. C’est un compilateur C pour Windows, MacOS X et Linux, capable de comstackr du code C en Java Byte Code (le type de code, qui s’exécute sur une machine virtuelle Java).

AMPC

Cependant, il est commercial et coûte 199 $ par licence. Je doute que cela rapporte pour vous;) Je ne connais aucun compilateur gratuit comme celui-là.

OTOH, Java et C sont assez similaires. Vous pourriez probablement refactoriser le code C en Java (les structures peuvent être remplacées par des objects avec des variables d’instance publiques) et les opérations de pointeur peuvent généralement être traduites en quelque chose d’autre (opérations de tableau par exemple). Bien que je suppose que vous ne voulez pas parcourir 5 000 lignes de code, n’est-ce pas?

L’utilisation de JNI rend le code dépendant de la plate-forme. Toutefois, si vous dites qu’il est indépendant de la plate-forme C, il n’y a aucune raison pour que votre code Java soit dépendant de la plate-forme. OTOH, en fonction du coût de ces calculs, utiliser JNI pourrait en réalité vous procurer un gain de performances. En ce qui concerne le débit brutal, C peut encore battre Java à la vitesse. Toutefois, les appels JNI sont très coûteux. Par conséquent, si le calcul n’est qu’un calcul très simple et rapide, l’appel JNI lui-même peut prendre autant de temps (ou même plus) que le calcul effectué. votre application et provoquer une surcharge de mémoire.

En effet, la JNA semble impressionnante, elle nécessite moins d’effort que d’utiliser directement JNI. Mais dans tous les cas, vous perdriez l’indépendance de la plate-forme, et comme vous n’en utilisez probablement qu’une petite partie, vous pourriez envisager de traduire ce dont vous avez réellement besoin.

Avez-vous essayé d’utiliser:

System.loadLibrary("mylibrary.dll"); 

Vous ne savez pas si cela fonctionnera avec une bibliothèque en C pur, mais cela en vaut probablement la peine. 🙂