Frage

Ich entwickle derzeit ein Projekt in Java geschrieben. Wir haben eine Reihe von Algorithmen in C geschrieben / C ++ (mindestens ein paar hundert), die in unserem Projekt eingebunden werden muß. Unsere beiden Optionen sind JNI zu verwenden, um diesen Code zu nennen, oder alle Algorithmen in Java neu zu schreiben.

Ich bin über die Folgen von JNI, kann es eine ganze Reihe neuer Probleme auftun, weshalb der gesamte Code in Java Umschreiben sogar in Betracht gezogen wird. Aber der Gedanke daran Umschreiben scheint ... falsch. Die Algorithmen wurden so weit getestet und arbeiten, wie ich weiß, sie sind nur in der falschen Sprache.

In dieser Situation würde JNI diese Aufgabe leicht machen? Oder wäre es mehr Kopfschmerzen verursachen, als den Code in Java umgeschrieben würde?


EDIT # 1: Verwandte Frage - Usefulness von JNI


EDIT # 2: FYI - Unser Java-Projekt in keiner Weise tragbar sein soll. Das könnte einer der Nachteile von JNI beseitigen, dass es angeblich Portabilität reduziert.

War es hilfreich?

Lösung

Die einfache Antwort ist, wenn der Code viel und Leistung genannt Angelegenheiten dann werden wird konvertieren über Java.

Die komplexeren Antworten sind:

  • , wenn die Bibliothek einfach in JNI gewickelt dann mit JNI gehen
  • , wenn die Tests, die Sie für die C haben / C ++ Code leicht dann für den Hafen gehen auf Java umgewandelt über

Ich würde folgendes tun:

  • nehmen Sie einen der Algorithmen und wickeln Sie es in JNI
  • nimmt den gleichen Algorithmus und wandelt es in Java
  • sehen, welche mehr Schmerz zu tun
  • , wenn die Geschwindigkeit Angelegenheiten dann beide Versionen Profil und welche von ihnen sehen, ist akzeptabel.

Andere Tipps

Ich denke, die Antwort liegt in der Stärke der Kopplung zwischen dem Aufruf von Java-Code und der aufgerufenen C / C ++ Code und in der Ebene des Aufwand wäre würde die Rewrite zur Folge hat. Wenn Ihr C-Code ein paar Zahlen nimmt, hat einige haarige Berechnung und gibt einen anderen int. Verwenden Sie JNI. Wenn es eine Menge komplexer ist hin und her, aber die Algorithmen sind relativ einfach, schreiben sie. Die Verwerfungslinie ist die JNI-Verbindung. Wenn das wird kompliziert sein, können Sie mehr JNI-Schnittstelle das Schreiben von Code am Ende, als Sie Code für ein Rewrite-Algorithmus würde.

Wenn die „Algorithmen“ sind gut verpackt, ist es vielleicht möglich, einige automatische Glue-Code, durch JNI zu schaffen? Das würde auf dem Risiko von Fehlern reduzieren (Hunderte von einzelnen Komponenten manuell klingt riskant zu schaffen), und stellen Sie die Kosten unabhängig von der Anzahl von Algorithmen an, mehr oder weniger.

Umschreiben Hunderte von Komponenten klingt sehr riskant, würde ich auf jeden Fall empfehlen zumindest untersuchen JNI enger zuerst.

Was I / O-Anforderungen haben die Algorithmen haben in Bezug auf den Rest des Projektes? Wenn sie ziemlich lose gekoppelt sind, vielleicht würde es möglich sein, sie als freistehende getrennte Programme auszuführen, aufgerufen als Teilprozesse von Java und unter Verwendung von z.B. stdio Daten zu teilen?

Ich glaube, Sie werden feststellen, dass JNI nicht so schlimm, wie es in dem Tauchen vor scheint. Es gibt einige wichtige Kompromisse und Einschränkungen, aber im Allgemeinen JNI funktioniert gut und ist recht einfach zu Hebelwirkung, wie Sie möchten.

Wie andere der beste Fall für JNI gesagt haben, ist:

  • Komplexe nativen Code (Bonuspunkte, wenn dieser Code bereits sehr zuverlässig erwiesen hat)
  • Minimal Hin- und Herschalten zwischen Java und nativen Code (Sie möchten die Fahrten über die JNI-Schicht minimieren)
  • Relativ einfache Berufung Schnittstelle zu dem nativen Code (oder auch auf Java zurück, wenn Sie native Code sind zu nutzen, muss Java-Objekte / Methoden)

Es ist auf jeden Fall möglich, die Schaffung einer JNI-Schicht für einen einigermaßen strukturierten Satz von nativen Komponenten zu automatisieren oder pseudo-automatisiert. Das wäre es wert sein, wenn die Anzahl der Komponenten zu wickeln groß ist.

Die gute Nachricht mit JNI ist, dass es einfach sein sollte, damit Sie diese Schnittstelle zu bauen und zu testen, zum Beispiel sollten Sie in der Lage sein, Testfälle aus Java zu schreiben, den Algorithmus Verhalten exploit bestehenden und wenn es Probleme gibt würden sie höchstwahrscheinlich in der JNI-Schicht selbst und nicht die Algorithmen (Ihr Vertrauen in die native Umsetzung).

eine große Anzahl von C / C ++ Algorithmen in Java Umschreiben scheint viel riskanter mir als JNI. Ohne die Details zu kennen, ist es schwer zu beurteilen, natürlich, aber es gibt feine Unterschiede zwischen den Technologien, die ich mir vorstellen könnte die tatsächliche Implementierung eines Algorithmus zu beeinflussen, nicht nur den schieren Engineering-Aufwand und Fehlerrisiko zu nennen.

Eine letzte Überlegung ist es, zukünftige Leben dieser Algorithmen oder verwandte Komponenten. Ist der Satz von Algorithmen mehr oder weniger abgeschlossen ist, oder weiterhin die Sie hinzufügen? So oder so ist es ein starke Wartung und / oder zukünftige Entwicklung Grund eine Technologie über die andere zu bevorzugen? Zum Beispiel, wenn alles andere in Java und alle neuen Algorithmen in Java sein und fast jeder im Team ist Codierung fast immer in Java, in Java Neuimplementierung beginnt attraktiver langfristige zu suchen.

Doch auch mit dieser sagte, Arbeits Trümpfe konsistent. Für eine große Anzahl von gut funktionierenden nativen Komponenten würde ich immer noch geneigt sein, mit JNI zu starten, auch wenn Sie auf Java langfristig übergehen würden.

Ich würde immer noch ernsthaft in Erwägung ziehen für JNI gehen, vor allem, wenn Sie die Anzahl der sprachübergreifende Schnittstellen zu minimieren sind in der Lage.

Wenn zum Beispiel gibt es einen ganzen Stapel von C-Funktionen, die alle die gleichen Ein- und Ausgänge haben, aber nur tun verschiedene Arbeiten an den Eingängen, wickeln, dass mit einem zusätzlichen Parameter in einem einzigen JNI-Wrapper, um festzulegen, welche spezifischen Algorithmus zu verwenden.

Wenn Sie zukünftige Projekte in Java zu schreiben, planen, im Gegensatz zu C / C ++. Ich würde den sauren Apfel beißen jetzt und Port den Code über Java. Je länger Sie warten desto schlechter wird es werden. Die JNI klingt attraktiv in diesem Fall, aber dann haben Sie das Problem von jemand mit dem C ++ Code zu halten, wenn alle anderen auf den Spaß neue Java-Projekte ist.

Wenn dies ein einmaliges Java-Projekt, dann warum Sie es in Java schreiben?

Die Brücke zwischen C und Java ist teuer, also wenn Sie haben eine Menge Daten zurück zu passieren und her gibt es keinen Sieg C über JNI in aufrufen.

I JNA habe als eine vernünftige Alternative zu JNI mit viel weniger Schmerzen zu nennen Methoden in einem DLL / Shared Library von Java in einer Reflexion wie Art und Weise aufgeführt gesehen. Ich habe es noch nicht probiert.

können Sie möchten Ihre C-Code als Linux-MIPS binär prüfen kompilieren, die in Java interpretiert werden kann. Recht schnell, ein bisschen schwer richtig einzurichten. Siehe http://nestedvm.ibex.org/

Auch Sie können einen llvm Backend gcc zu kompilieren Bytecode LowLevel die dann in Java interpretiert werden. Dies ist auch der Ansatz mit dem afaik iPhone SDK genommen auf Mac OS X. http://llvm.org/

Read Joels receint Post auf " Bezahlen Ihrer technischen Schulden down" dann gehen sie vor und wandeln es jetzt anstatt zu zahlen Zinsen in den nächsten paar Jahre und dann es zahlt sich aus.

Vielleicht könnten die neu verpackten Bibliotheken als auch an mehr Orten nützlich sein. Wenn sie sinnvoll und komplex genug sind, um Sie sie in C zu machen denken Sie daran zu halten, müssen sie noch mehr haben einmal schön in Mehrweg verpackt verwenden, leicht verteilbar und verständlich Klassen.

Ich habe in dieser Situation gewesen. Ich schlage vor, dass Sie mit den Multi-Threaded-Datenstrukturen zu gewöhnen, die in Java zur Verfügung stehen. An dieser Stelle werden Sie nicht zurück zu Ihrem C ++ Datenstrukturen nicht mehr gehen wollen.

Sie werden auch feststellen, dass Sie können diese Algorithmen viel besser neu schreiben, mit nachdenklichen Techniken, besser Polymorphismus, Adapter-Mustern und so weiter.

Wenn Sie in der C / C ++ Code sitzen, Sie denken, dass Sie es hängen wollen. Sie denken über all die Liebe Sie in Betrieb genommen. In einigen Jahren werden Sie erkennen, dass durch es festhalten und mit JNI, dass Sie ein Monster geschaffen haben. Jedes Mal, wenn Sie einen Prozess Absturz Sie JNI bereuen werden. Nach dem Prozess Absturz Fixierung wird wollen, dass jemand einen Algorithmus in C ++ ändern, und Sie werden sie drosseln wollen. Sie werden eine bequeme Ausrede wie „ich noch nicht auf Java gewohnt bin.“

Werfen Sie einen Blick auf unveränderlichen Datenstrukturen in Java. Denken Sie nicht einmal über die Geschwindigkeit, dass diese alten C / C ++ Algorithmen auszuführen. Ich habe festgestellt, dass mein neuer Code weit aus paces jeden meines alten C / C ++ Code.

schreiben Unit-Tests. Verwenden NetBeans.

Mit freundlichen Grüßen

-Stosh

Geben Sie JNI versuchen. Wenn dann mit irgendwelchen Problemen können Sie die problematischen umschreiben oder wickeln JNI mit Web Service aufruft und stellen Sie sie auf verschiedenen Feldern oder virtuellen Boxen.

Ist dies nur für Windows, und sie sind bereits in einer DLL, vielleicht JNA wäre von nutzen sein. (Wenn die Leistung für die Funktion getroffen durch JNA nennt, ist nicht so schlecht)

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