2008-09-17 5 views
9

Ich habe diese Open-Source-Bibliothek gefunden, die ich in meiner Java-Anwendung verwenden möchte. Die Bibliothek ist in C geschrieben und wurde unter Unix/Linux entwickelt, und meine Anwendung läuft unter Windows. Es ist eine Bibliothek von meist mathematischen Funktionen, so weit ich sagen kann, dass es nichts verwendet, was plattformabhängig ist, es ist nur ein sehr einfacher C-Code. Außerdem ist es nicht so groß, weniger als 5.000 Zeilen.Was ist der einfachste Weg, um C-Quellcode in einer Java-Anwendung zu verwenden?

Was ist der einfachste Weg, die Bibliothek in meiner Anwendung zu verwenden? Ich weiß, dass es JNI gibt, aber das beinhaltet, einen Compiler zu finden, um die Bibliothek unter Windows zu kompilieren, mit dem JNI-Framework auf dem neuesten Stand zu sein, den Code zu schreiben usw. Doable, aber nicht so einfach. Gibt es einen leichteren Weg? Angesichts der geringen Größe der Bibliothek bin ich versucht, sie einfach in Java zu übersetzen. Gibt es irgendwelche Werkzeuge, die dabei helfen können?


EDIT

ich den Teil der Bibliothek übersetzen endete, dass ich zu Java benötigt. Es ist ungefähr 10% der Bibliothek bis jetzt, obwohl es wahrscheinlich mit der Zeit zunehmen wird. C und Java sind ziemlich ähnlich, also dauerte es nur ein paar Stunden. Die Hauptschwierigkeit besteht darin, Fehler zu beheben, die durch Fehler in der Übersetzung entstehen.

Vielen Dank für Ihre Hilfe. Die vorgeschlagenen Lösungen schienen alle interessant zu sein und ich werde sie untersuchen, wenn ich mit größeren Bibliotheken verlinken muss. Für ein kleines Stück C-Code war die manuelle Übersetzung die einfachste Lösung.

+0

Bevor Sie weiter mit Ihrer Anwendung gehen, werfen Sie einen Blick auf die [Apache Commons Mathsbibliothek API Dokumentation] (http://commons.apache.org/math/api-1.2/index.html) –

Antwort

5

Ihre beste Wette ist wahrscheinlich, ein gutes Buch zu nehmen (K & R: The C Progranmming Sprache) eine Tasse Tee und beginnen zu übersetzen! Ich wäre skeptisch, wenn ich einem Übersetzungsprogramm traue, häufiger ist dann nicht der beste Übersetzer du selbst! Wenn du das machst, dann ist es erledigt und du musst es nicht weiter machen. Wenn die Bibliothek Open Source ist, kann es zu einigen Komplikationen kommen. Sie müssen die Lizenz sorgfältig prüfen. Ein weiterer zu berücksichtigender Punkt ist, dass es immer ein gewisses Risiko und einen möglichen Fehler bei der Übersetzung geben wird. Daher kann es notwendig sein, einige Tests zu schreiben, um sicherzustellen, dass die Übersetzung korrekt ist.

Gibt es keine JAVA-gleichwertigen mathematischen Funktionen?

Wie Sie selbst kommentieren, ist der JNI-Weg möglich, denn für einen c-Compiler könnten Sie wahrscheinlich 'Bloodshead Dev-C++' verwenden, aber es ist eine Menge Aufwand für ~ 5000 Zeilen.

4

Ich würde es kompilieren und JNA verwenden.

JNA (Java Native Access) ist im Grunde in der Laufzeit was JNI zur Kompilierzeit und benötigt keine non-Java-Code (nicht viel Java entweder).

Ich weiß nicht über seine Leistung oder Benutzerfreundlichkeit in Ihrem Fall, aber ich würde es versuchen.

+0

Ich habe nicht berührt Java in Jahren, aber ich dachte, es hieß JNI-Java Native Interface. Lass mich wissen, wenn sie den Namen geändert haben. –

+1

@ManVsCode Vielleicht möchten Sie diese Bemerkung entfernen, es ergibt keinen Sinn. Lesen Sie die Antwort erneut. –

11

Im Projekt Java GNU Scientific Library habe ich Swig verwendet, um die JNI-Wrapper-Klassen um die C-Bibliotheken zu generieren. Tolles Tool und kann auch Wrapper-Code in mehreren Sprachen einschließlich Python generieren. Sehr empfehlenswert.

-2

Haben Sie versucht, mit:

System.loadLibrary("mylibrary.dll"); 

Nicht sicher, ob dies mit einer reinen C-Bibliothek funktioniert, aber es ist wahrscheinlich einen Versuch wert. :)

+1

Und was dann? – dmeister

0

In der Tat sieht JNA beeindruckend aus, es erfordert weniger Aufwand als direkt mit JNI.Aber in jedem Fall würden Sie die Plattformunabhängigkeit verlieren, und da Sie wahrscheinlich nur einen kleinen Teil davon verwenden, könnten Sie in Erwägung ziehen, das zu übersetzen, was Sie tatsächlich benötigen.

0

Nun, es gibt AMPC. Es ist ein C-Compiler für Windows, MacOS X und Linux, der C-Code in Java-Byte-Code (die Art von Code, der auf einer Java Virtual Machine läuft) kompilieren kann.

AMPC

Allerdings ist es kommerziell und kostet $ 199 pro Lizenz. Ich bezweifle, dass sich das für dich auszahlt;) Ich kenne keinen solchen kostenlosen Compiler.

OTOH, Java und C sind ziemlich ähnlich. Sie könnten den C-Code wahrscheinlich zu Java umgestalten (Strukturen können durch Objekte mit öffentlichen Instanzvariablen ersetzt werden) und Zeigeroperationen können normalerweise in etwas anderes übersetzt werden (zum Beispiel Array-Operationen). Obwohl ich glaube, dass du nicht 5000 Zeilen Code durchgehen willst, oder?

Die Verwendung von JNI macht die Code-Plattform abhängig, wenn Sie jedoch sagen, dass es plattformunabhängig C ist, gibt es keinen Grund, warum Ihr Java-Code plattformabhängig sein sollte. OTOH, je nachdem, wie kostspielig diese Berechnungen sind, könnte die Verwendung von JNI Ihnen tatsächlich einen Leistungszuwachs bringen, da C, wenn es sich um einen rohen Zahlenverarbeitungsdurchsatz handelt, immer noch Java in der Geschwindigkeit schlagen kann. JNI-Aufrufe sind jedoch sehr kostenintensiv. Wenn die Berechnung nur eine sehr einfache, schnelle Berechnung ist, kann der JNI-Aufruf selbst genauso lange (oder sogar länger) dauern als die Berechnung. In diesem Fall wird JNI nichts kaufen, sondern langsamer Herunterfahren Ihrer App und verursachen Speicher Overhead.

1

Sind Sie sicher, dass Sie die C-Bibliothek verwenden möchten, auch wenn sie so klein ist?

Sobald 64-Bit ein wenig gebräuchlicher wird, müssen Sie mit der Erstellung/Bereitstellung von sowohl 32-Bit- als auch 64-Bit-Versionen der Bibliothek beginnen. Und je nachdem, wie der C-Code aussieht, müssen Sie den Code möglicherweise aktualisieren oder nicht, um ihn als 64-Bit zu erstellen.

Wenn die C-Bibliothek einfach ist, kann es einfacher sein, die C-Bibliothek einfach in reines Java zu portieren und sich nicht mit dem Erstellen/Bereitstellen einer JNI-Bibliothek, der C-Bibliothek und des Java-Codes befassen.