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

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

  •  01-07-2019
  •  | 
  •  

Question

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.

Quel est le moyen le plus simple d'utiliser la bibliothèque dans mon application? Je sais qu'il existe JNI, mais cela implique de trouver un compilateur pour compiler 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? Vu la petite taille de la bibliothèque, je suis tenté de la traduire simplement en Java. Existe-t-il des outils pouvant vous aider?


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, bien que cela augmente probablement avec le temps. C et Java sont assez similaires, il n'a donc fallu que quelques heures. La difficulté principale 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 examinerai lorsque je devrai créer des liens vers des bibliothèques plus importantes. Pour un petit morceau de code C, la traduction manuelle était la solution la plus simple.

Était-ce utile?

La solution

Votre meilleur choix est probablement de prendre une bonne tasse de thé dans un livre (K & amp; R: le langage de programmation C) et de commencer à traduire! Je serais sceptique quant à la confiance dans un programme de traduction, le plus souvent 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. Il peut donc être nécessaire d’envisager de passer des tests pour vous assurer que la traduction est correcte.

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

Comme vous le commentez vous-même, la méthode JNI est possible. Pour un compilateur c, vous pouvez probablement utiliser 'Bloodshead Dev-c ++', mais cela demande beaucoup d’efforts pour environ 5000 lignes.

Autres conseils

Sur le projet Bibliothèque scientifique GNU Java , 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. Fortement recommandé.

Je le compilerais 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 suis pas au courant de ses performances ou de sa facilité d'utilisation dans votre cas, mais je voudrais l'essayer.

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

Une fois que la version 64 bits devient un peu plus courante, vous devez é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 le mettre à jour pour qu'il soit compilé 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 création / déploiement d’une bibliothèque JNI, de la bibliothèque C et du code java.

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

AMPC

Cependant, c'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 objets 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. Cependant, 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é. Dans ce cas, l’utilisation de JNI ne vous rapportera rien. votre application et entraîner une surcharge de mémoire.

En effet, la JNA semble impressionnante, elle nécessite moins d’efforts que l’utilisation directe de 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");

Je ne sais pas si cela fonctionnera avec une bibliothèque C pure, mais cela en vaut probablement la peine. :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top