Frage

Ich fand dieses Open-Source-Bibliothek, die ich in meiner Java-Anwendung verwenden möchten. Die Bibliothek ist in C geschrieben und wurde unter Unix / Linux entwickelt, und meine Anwendung wird unter Windows ausgeführt werden. Es ist eine Bibliothek von meist mathematischen Funktionen, so weit wie ich kann sagen er nichts verwenden, die plattformabhängig ist, ist es nur sehr einfache C-Code. Außerdem ist es nicht so groß, weniger als 5.000 Zeilen.

Was ist der einfachste Weg, um die Bibliothek in meiner Anwendung zu benutzen? Ich weiß, dass es JNI, aber das beinhaltet einen Compiler zu finden, die Bibliothek unter Windows zu kompilieren, immer up-to-date mit dem JNI Rahmen, den Code zu schreiben, usw. Doable, aber nicht so einfach. Gibt es einen einfacheren Weg? die geringe Größe der Bibliothek Unter Berücksichtigung, bin ich versucht zu übersetzen es nur auf Java. Gibt es irgendwelche Tools, die dabei helfen können?


Bearbeiten

beenden ich den Teil der Bibliothek zu übersetzen, die ich zu Java benötigt. Es ist etwa 10% der Bibliothek so weit, obwohl es wahrscheinlich mit der Zeit zunehmen werde. C und Java sind ziemlich ähnlich, so dauerte es nur ein paar Stunden. Die Hauptschwierigkeit ist zur Festsetzung der Fehler, die durch Fehler in der Übersetzung eingeführt erhalten.

Vielen Dank an alle für Ihre Hilfe. Die vorgeschlagenen Lösungen schienen alle interessant und ich werde in sie aussehen, wenn ich zu größeren Bibliotheken verknüpfen müssen. Für ein kleines Stück C-Code, war manuelle Übersetzung die einfachste Lösung.

War es hilfreich?

Lösung

Ihre beste Wette ist wahrscheinlich ein guten c Buch (K & R: Die C Progranmming Sprache) greifen eine Tasse Tee und beginnen zu übersetzen! Ich würde skeptisch über ein Übersetzungsprogramm zu vertrauen, häufig dann nicht der beste Übersetzer ist selbst! Wenn Sie dies tun, dann ist es getan, und Sie brauchen nicht wieder tun, es zu halten. Es könnte einige Komplikationen, wenn die Bibliothek Open Source ist, werden Sie die Lizenz sorgfältig, um dies überprüfen müssen. Ein weiterer Punkt ist, dass es immer geht ein gewisses Risiko und möglicher Fehler in der Übersetzung sein, deshalb könnte es notwendig sein, zu prüfen, einige Tests zu schreiben, um sicherzustellen, dass die Übersetzung korrekt ist.

Gibt es keine JAVA equivelent Mathematische Funktionen?

Wie Sie selbst kommentieren die JNI Art und Weise möglich ist, wie für einen C-Compiler Sie wahrscheinlich 'Bloodshead Dev-C ++ funktionieren könnte verwenden könnte, aber es ist viel Aufwand für ~ 5000 Zeilen.

Andere Tipps

Auf der Java GNU Scientific Library Projekt, das ich verwenden Swig die JNI-Wrapper-Klassen um die C-Bibliotheken zu erzeugen. Großes Werkzeug und kann auch Wrapper-Code in mehreren Sprachen, darunter Python erzeugen. Sehr zu empfehlen.

Ich würde es kompilieren und JNA verwenden.

JNA (Java Native Access) ist im Grunde tut in Laufzeit, welche JNI bei der Kompilierung und braucht nicht jeden Nicht-Java-Code (nicht viel Java entweder).

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

Sind Sie sicher, dass Sie die C-Bibliothek verwenden, auch wenn es ist, dass klein?

Nach 64-Bit ein wenig häufiger bekommt, müssen Sie den Aufbau von Start / Bereitstellung von sowohl 32-Bit und 64-Bit-Versionen der Bibliothek als auch. Und je nachdem, was der C-Code ist wie, können Sie oder können nicht den Code aktualisieren müssen, um es als 64-Bit-machen zu bauen.

Wenn die C-Bibliothek einfach ist, kann es einfacher seinen Hafen, nur die C-Bibliothek zu reinem Java und nicht mit dem Bau zu tun haben / eine JNI-Bibliothek bereitstellen, die C-Bibliothek und den Java-Code.

Nun, es ist AMPC. Es ist ein C-Compiler für Windows, MacOS X und Linux, die C-Code in Java Byte-Code (die Art von Code, die auf einer virtuellen Java-Maschine ausgeführt wird) zusammenstellen kann.

AMPC

Allerdings ist es kommerziell und kostet $ 199 pro Lizenz. Ich bezweifle, dass sich für Sie auszahlt;) Ich weiß nicht, von jedem freien Compiler wie das

.

OTOH, Java und C sind ziemlich ähnlich. Sie könnten wahrscheinlich den C-Code zu Java Refactoring (structs kann mit Objekten mit öffentlichen Instanzvariablen ersetzt werden) und Zeigeroperationen können in der Regel auf etwas anderes übersetzt werden (Array-Operationen zum Beispiel). Obwohl ich glaube, Sie nicht über 5.000 Zeilen Code gehen wollen, tun Sie?

Mit JNI macht den Code plattformabhängig, aber wenn Sie sagen, dass es plattformunabhängig C ist, gibt es keinen Grund, warum Ihr Java-Code sollte plattformabhängig. OTOH, je nachdem, wie teuer diese Berechnungen sind, unter Verwendung von JNI könnte Sie tatsächlich einen Performance-Gewinn kaufen, als wenn es um rohen Zahlknirschens Durchsatz kommt, kann C noch schlagen Java in der Geschwindigkeit. JNI Anrufe jedoch sehr teuer sind, so dass, wenn die Berechnung ist nur eine sehr einfache, schnelle Berechnung, rufen Sie die JNI selbst könnte genauso lange dauern (oder auch länger) als die Berechnung durchgeführt wird, wobei in diesem Fall JNI wird kaufen Sie nichts, aber verlangsamt Sie Ihre App und Speicher-Overhead zu verursachen.

Tatsächlich JNA sieht beeindruckend, es erfordert weniger Aufwand als direkt JNI. Aber in jedem Fall würden Sie die Plattformunabhängigkeit verlieren, und da Sie wahrscheinlich nur einen kleinen Teil davon verwenden, sollen Sie überlegen, zu übersetzen, was Sie wirklich brauchen.

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. :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top