2008-09-17 20 views
9

J'ai trouvé cette bibliothèque open-source que je veux 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 pour autant que je sache, il n'utilise pas tout ce qui dépend de la plateforme, c'est juste du code C très basique. De plus, ce n'est pas si gros, moins de 5 000 lignes.Quel est le moyen le plus simple d'utiliser le code source C dans une application Java?

Quelle est la manière la plus simple d'utiliser la bibliothèque dans mon application? Je sais qu'il y a JNI, mais cela implique de trouver un compilateur pour compiler la librairie sous Windows, se mettre à jour avec le framework JNI, écrire le code, etc. Possible, 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 le traduire en Java. Y a-t-il des outils qui peuvent vous aider?


EDIT

J'ai fini par traduire la partie de la bibliothèque que je devais Java. C'est environ 10% de la bibliothèque jusqu'à présent, mais cela va probablement augmenter avec le temps. C et Java sont assez similaires, donc cela n'a pris que quelques heures. La principale difficulté est de corriger les bogues qui sont introduits par des erreurs dans la traduction.

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

+0

Avant d'aller plus loin avec votre Application, jetez un coup d'oeil à la [API API Library Bibliothèque Apache Commons] (http://commons.apache.org/math/api-1.2/index.html) –

Répondre

5

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

Existe-t-il des fonctions Math JAVA équivalentes? Comme vous l'avez vous-même commenté, la manière JNI est possible, car pour un compilateur c, vous pouvez probablement utiliser 'Bloodshead Dev-C++', mais cela demande beaucoup d'efforts pour ~ 5000 lignes.

4

Je le compilerais et utiliserais JNA. JNA (Java Native Access) est fondamentalement en cours d'exécution quel JNI au moment de la compilation et n'a pas besoin de code non-java (pas beaucoup de Java non plus).

Je ne connais pas ses performances ni sa convivialité dans votre cas mais je ferais un essai.

+0

Je n'ai pas touché Java dans les années mais je pensais qu'il s'appelait JNI-Java Native Interface. Faites-moi savoir si ils ont changé le nom. –

+1

@ ManVsCode vous voudrez peut-être supprimer cette remarque, cela n'a pas de sens. Relisez la réponse. –

11

Sur le projet Java GNU Scientific Library, j'ai utilisé Swig pour générer les classes d'encapsuleur 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é.

-2

Avez-vous essayé d'utiliser:

System.loadLibrary("mylibrary.dll"); 

Je ne sais pas si cela va fonctionner avec une bibliothèque C pure, mais il est un coup probablement la peine. :)

+1

Et que faire quoi? – dmeister

0

En effet, JNA a l'air impressionnant, il 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 puisque vous n'utilisez probablement qu'une petite partie de celle-ci, vous pourriez envisager de traduire ce dont vous avez réellement besoin.

0

Eh bien, il y a AMPC. C'est un compilateur C pour Windows, MacOS X et Linux, qui peut compiler 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 paye pour vous;) Je ne connais pas de compilateur gratuit comme ça.

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 pointage peuvent généralement être traduites en quelque chose d'autre (opérations de tableaux par exemple). Bien que je suppose que vous ne voulez pas passer par 5 000 lignes de code, n'est-ce pas? L'utilisation de JNI rend la plate-forme de code dépendante, mais si vous dites qu'elle est indépendante de la plate-forme C, il n'y a aucune raison pour que votre code Java dépende de la plate-forme. OTOH, en fonction de la complexité de ces calculs, l'utilisation de JNI pourrait vous rapporter un gain de performance, car en ce qui concerne le débit de calcul des nombres bruts, C peut encore battre Java en vitesse. Cependant, les appels JNI sont très coûteux, donc si le calcul est juste 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é, auquel cas JNI ne vous achètera rien, mais ralentira bas de votre application et provoquant des frais généraux de mémoire.

1

Etes-vous sûr de vouloir utiliser la bibliothèque C, même si elle est petite? Une fois que le bit 64 devient un peu plus courant, vous devrez commencer à construire/déployer aussi bien les versions 32 bits que 64 bits de la bibliothèque. Et selon le code C, vous pouvez ou non avoir besoin de mettre à jour le code pour le construire en 64 bits. Si la bibliothèque C est simple, il peut être plus facile de simplement porter la bibliothèque C vers Java pur et ne pas avoir à gérer la construction/déployer une bibliothèque JNI, la bibliothèque C et le code java.