2008-08-18 20 views
5

Ich bin gerade dabei, meine erste Reise in die Welt von JNI (Java Native Interface) zu machen, um Benachrichtigungen über Dateisystemänderungen von plattformspezifischem C/C++ - Code an Java zu senden. Das ist, es sei denn jemand schlägt eine brillante Bibliothek vor, die ich verpasst habe.JNI und Java: Ameise anrufen machen oder Anruf ameise machen?

Da ich neu bei JNI bin, habe ich viel Dokumentation auf der Interface-Seite und der Seite der Bibliothekserstellung gefunden, aber ich habe nicht viel beim Aufbau der nativen Bibliothek gefunden.

Ich habe eine bestehende Build basierend auf Ant für die bereits vorhandene Java-Quelle, also versuche ich herauszufinden, ob ich ant auf Anruf machen sollte, um die Bibliothek zu erstellen oder wenn es am besten ist, zu machen Ameise nach dem Erstellen der Bibliothek anrufen?

Keine der beiden Optionen erscheint als schrecklich nett, aber beide scheinen besser zu sein, als zu versuchen, einen Compiler aufzurufen, um den Code zu kompilieren und die Bibliothek direkt zu generieren.

Antwort

3

Ich mag stark wegen seiner impliziten Regelsetzung und Behandlung von Leerzeichen. Persönlich würde ich cpp Aufgaben (http://ant-contrib.sourceforge.net/cpptasks/index.html) verwenden, um meine C-Kompilierung durchzuführen. Sie sind nicht so flexibel wie make, aber sie sind auch viel weniger komplex und es bedeutet, dass Sie Ihre Entwickler nicht mit Lernen belasten müssen.

+0

CPP Aufgaben funktionierte gut für das, was ich brauchte, danke. Am Ende musste ich eine Cross-Compilierung durchführen, aber die Möglichkeit, anzugeben, welche Klasse für das Back-End von cpptasks verwendet werden sollte, löste das Problem. –

3

Als eine einfachere Alternative zu JNI, versuchen Sie JNA: https://jna.dev.java.net/, kann diesen Aufwand für Sie lösen und einfacher sein (vorausgesetzt, es kann tun, was Sie wollen).

+0

JNA sah aus wie eine nette Art zu tun, was ich wollte, aber leider musste ich anfangen, neue Fensterklassen zu erstellen und Funktionen dafür zurückzurufen, was nicht möglich schien, also musste ich wieder auf JNI zurückgreifen. –

1

Ich arbeite gerade an etwas ähnlichem. Seien Sie sich bewusst, dass Swig von swig.org oft einfacher ist, da es die Stubs für die native Bibliothek generiert.

Die kurze Antwort auf Ihre Frage ist, dass die Ant-Datei die make-Datei ausführen soll, nachdem die Java-Bibliothek bereits erstellt wurde, da die native Bibliothek vom generierten swig-Header abhängt, der aus den Java-Klassendateien generiert wird.

Wenn Sie mit Ameisen bestens vertraut sind und kein neues System lernen wollen, dann können Sie mit http://ant-contrib.sourceforge.net/cpptasks/index.html, auch verbunden durch ein anderes Poster, C++ in ant erstellen.

1

Ich würde JNI vollständig überspringen und ein externes Programm verwenden, das Benachrichtigungen auf Standardausgabe schreibt. Java kann dann einfach aus dem Programmausgabestrom lesen und das Ereignis generieren, das notwendig ist. JNI ist viel zu viel Arbeit, wenn Sie nur einfache Benachrichtigungen senden möchten.

Auch unter Linux können Sie einfach "inotifywait" starten (mit einigen geeigneten Parametern, siehe "man inotifywait").

0

Sie könnten auch die Terp C++ - Aufgaben unter Codemesh versuchen. Sie sind nicht frei, aber sie bieten ein hohes Maß an Abstraktion, gepaart mit der Fähigkeit, den C++ - Compiler zu finden/zu spezifizieren und die Fähigkeit, über mehrere Compiler/Prozessor-Architekturen/Compilerkonfigurationen für Multiplatform-Builds zu iterieren.