Pipe zu Windows Programm

Status
Nicht offen für weitere Antworten.
G

gonorthk

Gast
Ich habe ein kleines Windowsprogramm, dass Daten zu und von einem USB-Gerät schickt und liest.
Ich würde gerne eine Art Pipe oder Message Queue zwischen diesem Programm und meinem Java-Programm einrichten, damit ich die gelesen Daten im Java-Programm zur Verfügung habe bzw. auch Daten aus dem Java-Programm (über das Windowsprogramm) an das USB-Gerät senden kann.
Gibt es eine Möglichkeit dies, außer über Textdateien, zu lösen?
 
T

tuxedo

Gast
Socketverbindung wäre auch noch ne möglichkeit ... Wenn es um schnellen Datentransfer geht, bist du damit vermutlich auch schneller als mit JNI ...

Alternativ: JNA (http://jna.dev.java.net)

- Alex
 
G

Guest

Gast
Hmm, also Aufrufe an die API "DeviceIoControl" unter Windows sind mit den Bibliotheken wohl kaum zu realisieren...
 
T

tuxedo

Gast
Ist doch Teil von kernel32.dll? Oder hab ich da was verpasst? JNA kann soweit ich das bis jetzt selbst probiert hab, mt nahezu jeder beliebigen DLL sprechen ...

Und inbesondere mit den Windows-DLLs gibts da keine großen Probleme.

Und wenn nicht: Dann halt doch JNI, nur eben mit dem "Umweg" über einen selbstgeschrieben Wrapper in C/C++ ...

- Aex
 

Murray

Top Contributor
tuxedo hat gesagt.:
Socketverbindung wäre auch noch ne möglichkeit ... Wenn es um schnellen Datentransfer geht, bist du damit vermutlich auch schneller als mit JNI ...
Wieso sollte es schneller sein, Daten über das Netzwerk zu verschicken, als sie innerhalb des gleichen Prozesses behalten?
 
T

tuxedo

Gast
localhost != Netzwerk ;-) Oder so ...

Wenn du viele Daten von C nach Java und umgekehrt schicken musst, sind viele Calls in der JVM von nöten. Wie und wo genau kann ich dir nicht sagen.
Musste in meinem Praxissemester bei Daimler einen Wrapper für einen Treiber basteln der als DLL vorlag. Der Treiber war für ein PC-Card CAN-Bus Interface.
Vor mir hat das schonmal jemand gemacht. Aber komplett mit JNI. Fazit: Wenn viel auf dem Bus los war (>10MB/sek), konnten die Daten nicht schnell genug gelesen werden. Nehme an das Lag an irgendwelchen Callback-Geschichten von C nach Java via JNI.

Ich hab das dann halb mit JNI und halb mit Sockets gelöst: Die DLL wurde via JNI angesteuert, aber die Daten kamen via Socket über localhost. Alles andere brachte nicht die gewünschte Performance.

Aber das war noch zu Java 1.5 Zeiten. Vielleicht ist das mittlerweile besser/schneller geworden.

- Alex
 

Murray

Top Contributor
tuxedo hat gesagt.:
localhost != Netzwerk ;-) Oder so ...
Das Netzwerk wird zwar nicht verwendet, der IP-Stack aber schon - man verwendet also ein Subsystem, welches Pakete verwaltet, irgendwelche Headerinformationen ergänzt, die Reihenfolge der Pakete überwacht und, und, und...
 

Murray

Top Contributor
tuxedo hat gesagt.:
Wenn du viele Daten von C nach Java und umgekehrt schicken musst, sind viele Calls in der JVM von nöten. Wie und wo genau kann ich dir nicht sagen.
Kühne Behauptung (und genausowenig wie Deine belegt): was auch immer an Overhead notwendig ist, um bei native Calls zwischen C und Java irgendwelche Typen hin- und herzuwandeln, wird auch bei der Verwendung von Sockets notwendig sein.
Dass es Implementierungen gibt, die JNI ineffizient verwenden, ist natürlich unbestritten - daraus sollte man aber nicht schließen, das JNI selbst irgendwie langsam wäre.
 
T

tuxedo

Gast
Ich sagte ja,

".. bist du damit vermutlich auch schneller als mit JNI ...".

Und

"Wie und wo genau kann ich dir nicht sagen."

Die Typwandlung brauch man so oder so klar. Mir hats mein Oberhaupt damals so versucht zu erklären, dass für die generelle Kommunikation zwischen C und Java mittels JNI mehr Calls in der JVM notwendig sind, was mehr Overhead erzeugt, als wenn ich via Sockets die JVM "öffne".

Ob da tatsächlich was dran ist, wie gesgat: Kein Plan. Hatte bisher nicht die Zeit dem weiter nachzugehen.

"Das Netzwerk wird zwar nicht verwendet, der IP-Stack aber schon - man verwendet also ein Subsystem, welches Pakete verwaltet, irgendwelche Headerinformationen ergänzt, die Reihenfolge der Pakete überwacht und, und, und..."

Dachte mir das sowas kommt. Mit dem "Oder so" war eher gemeint: "Da wird die Netzwerkkarte nicht involviert".

Gruß
Alex
 

Murray

Top Contributor
tuxedo hat gesagt.:
IMir hats mein Oberhaupt damals so versucht zu erklären, dass für die generelle Kommunikation zwischen C und Java mittels JNI mehr Calls in der JVM notwendig sind, was mehr Overhead erzeugt, als wenn ich via Sockets die JVM "öffne".

Ob da tatsächlich was dran ist, wie gesgat: Kein Plan. Hatte bisher nicht die Zeit dem weiter nachzugehen.

Die Erklärung finde ich nicht so überzeugend, denn was passiert denn in der VM, wenn man Sockets verwendet? Letztendlich muss die VM doch auch Betriebssystemroutinen aufrufen, und das muss ja wohl per JNI passieren - insofern würde der hier postulierter Overhead bei der Verwendung von native Code doch ebenfalls zuschlagen (wenn es ihn denn überhaupt gibt).
 
T

tuxedo

Gast
Ein wenig gegoogelt und ich bin unter anderem auf das hier gestoßen (gibt noch mehr material dazu):

http://mindprod.com/jgloss/jni.html hat gesagt.:
A JNI call is very slow, in the order of .5 to 1.0 microseconds, the equivalent of pages of linear Java code to do a simple method call. You would think there would be a tiny generated machine code thunk to bridge between Java and C. Not so — at least in any JVM I know of, Java branches to some general purpose code that interpretively constructs the C parameters. This code is not highly optimised. It seems Sun wants to strongly discourage you from using native methods just for speed. This means you don’t want to hop back and forth between Java and C, but rather to go to C, and stay there a decently long time before returning. This means that you can’t use C to speed up short operations, only long ones, because of the overhead tacked on in getting to C wipes out any savings.

Oder hier:

http://forums.sun.com/thread.jspa?threadID=5329916 hat gesagt.:
...
D_L_Kumar:
I did some performance experiments and found that JNI version is more than 10 times slower than that of Java.
I am making lot of calls from C++ to Java and data transfer also. Is this the reason that is causing slowness.
...
cowwoc:
In general, you want to reduce the number of times you cross the JNI boundary. Try invoking methods that return a lot of data at once, as opposed to say invoking a method once per byte read.
...
D_L_Kumar:
... Yeah it worked for me. ...

Für Megabyteweise eingehender Datentransfer der möglichst zeitnah auf der Java-Seite verfügbar sein soll, bzw. auch umgekehrt, Daten die von Java gesendet werden und auf C-Seite möglichst zeitnah verarbeitet/gesendet werden sollen, trifft der Ratschlag, lieber eine Socketverbindung zu benutzen, vermutlich doch zu.

Klar, man kann auch eine recht große Puffergröße wählen um die Anzahl an Calls von C nach Java und uzmgekehrt zu vermindern, aber gerade beim Filetransfer ist es Blödsinn riesige Puffergrößen einzustellen. Werte deutlich über 8k finde ich für ein System das schnell auf Daten reagieren muss, doch ziemlich viel.

In diesem Sinne, besser beides (JNI und Sockets) ausprobieren, und sich nicht darauf verlassen dass "JNI es schon regeln wird"...
In meinem Fall, wo wirklich locker mal 10MB/sek angefallen sind, war JNI allein in der Tat zu langsam.

Gruß
Alex
 
T

tuxedo

Gast
Murray hat gesagt.:
Die Erklärung finde ich nicht so überzeugend, denn was passiert denn in der VM, wenn man Sockets verwendet? Letztendlich muss die VM doch auch Betriebssystemroutinen aufrufen, und das muss ja wohl per JNI passieren - insofern würde der hier postulierter Overhead bei der Verwendung von native Code doch ebenfalls zuschlagen (wenn es ihn denn überhaupt gibt).

Ich bezweifle dass SUN alle nativen Calls selbst mit DER JNI-Technik abgedeckt hat. Denke die haben da eine etwas modifizierte, JNI ähnlich Technik eingesetzt, die nicht ganz so nach "Eierlegende Wollmilchsau" Schreit und deshalb etwas performanter ist, eben weil sie nicht ganz so offen und flexibel sein muss.
Beweisen kann ichs (noch) nicht ;-)

- Alex
 

Murray

Top Contributor
tuxedo hat gesagt.:
Ich bezweifle dass SUN alle nativen Calls selbst mit DER JNI-Technik abgedeckt hat. Denke die haben da eine etwas modifizierte, JNI ähnlich Technik eingesetzt, die nicht ganz so nach "Eierlegende Wollmilchsau" Schreit und deshalb etwas performanter ist, eben weil sie nicht ganz so offen und flexibel sein muss.
Beweisen kann ichs (noch) nicht ;-)

Wenn Du da etwas finden solltest, würde mich das interessieren. Vorstellen kann ich mir das allerdings nur schwer - denn wie könnte der Übergang zwischen Bytecode und native Code anders passieren als per JNI?
 
T

tuxedo

Gast
Klar, wenn ich was finde berichte ich es natürlich.

Weswegen ich diese Vermutung aufgestellt habe:

JNI ist doch ein breit gefächertes Interface mit dem ich nahezu _alles_ machen kann. Und wie die Erfahrung zeigt, müssen Dinge, die nahezu _alles_ können, irgendwo abstriche machen. Und wie man aus den zwei Links die ich gepostet hab sieht, scheint das bei der Performance für viele kleine Calls passiert zu sein.

Damit die JVM, die vermutklich sehr viele nativen Calls macht (gerade beim Zeichnen, bei der Soundausgabe oder bei der Netzwerkkommunikation etc...) dieses "Problem" inne hat, denke ich dass ein etwas abgewandeltes JNI benutzen, das etwas performanter ist. Wie ich darauf komme?

Unter anderem deswegen

http://mindprod.com/jgloss/jni.html hat gesagt.:
at least in any JVM I know of, Java branches to some general purpose code that interpretively constructs the C parameters. This code is not highly optimised.

Da die nativen Calls, die in der JVM schon drin sind und auch im "alltäglichen JVM Leben" benutzt werden, VORHER schon bekannt sind, denke ich, gabs da gute Möglichkeiten das zu optimieren und "fest einzubauen", statt alles nochmal zur Laufzeit zu interpretieren (bezogen auf "interpretively constructs the C parameters") wie es JNI, wie wir es kennen, macht.

- Alex
 
G

Guest

Gast
Also JNA unterstützt DeviceIoControl in den Paketen jna.jar und examples.jar leider nicht.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Windows Pipe erzeugen Allgemeine Java-Themen 12
OnDemand String Split Pipe Allgemeine Java-Themen 2
R PIPE Kommunikation mit Prozess blockiert Allgemeine Java-Themen 0
F Bash Pipe benutzen Allgemeine Java-Themen 4
T Pipe-Funktion - Prozente falsch? Allgemeine Java-Themen 8
S Etwas Pipe-Ähnliches zur Prozesskommunikation Allgemeine Java-Themen 14
R -jar der Windows-Registry hinzufügen Allgemeine Java-Themen 1
C jar File mehrfach aufrufen (als Windows Dienst) Allgemeine Java-Themen 5
izoards JAR als Windows Service mit Appache Procrun (prunsrv) Allgemeine Java-Themen 6
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
HerrBolte Seltsamer Fehler nur in der Windows- und nicht in der Java-Console O_O Allgemeine Java-Themen 16
N iText keine Sonderzeichen und Umlaute unter Windows Allgemeine Java-Themen 13
MarekLanger Filebeat in Docker unter Windows Allgemeine Java-Themen 1
M Registry Autostart Eintrag mit Java erstellen (über Windows cmd) Allgemeine Java-Themen 7
S Java-Task-Management-Tool für Windows und Mac selber programmieren Allgemeine Java-Themen 4
M Console geht nicht auf (Windows 10) Allgemeine Java-Themen 3
M TomEE auf Windows Server 2016 installieren Allgemeine Java-Themen 4
Thallius Rätsel für Windows Profis Allgemeine Java-Themen 8
F Java Code ausführen direkt nach Anmelden in Windows Allgemeine Java-Themen 2
J jar Dateien unter Windows 7 mit spezifischer jdk öffnen Allgemeine Java-Themen 2
T Java Windows sounds erkennen Allgemeine Java-Themen 1
P Java als Windows Dienst Allgemeine Java-Themen 2
I GUI für kleine Pop-Ups unter Windows Allgemeine Java-Themen 1
H Änderung im maximalen heap space unter Windows 7 ?! Allgemeine Java-Themen 5
dereki2000 Windows Benachrichtigung erzeugen Allgemeine Java-Themen 2
Neumi5694 Task-Name unter Windows Allgemeine Java-Themen 4
M Checkliste mit erweiterbaren Einträgen, Baumstruktur, wie Windows Explorer Navigation Allgemeine Java-Themen 2
S Java OpenOffice Problem mit Windows-Benutzerwechsel Allgemeine Java-Themen 19
R JDK installieren JDK / Maven auf Windows 10 installieren Allgemeine Java-Themen 9
K jar-Datei lässt sich unter Windows nicht verwenden Allgemeine Java-Themen 3
Blender3D Java Swing Programm Windows 10 Autostart Problem Allgemeine Java-Themen 2
D Jsch nur für Windows? Allgemeine Java-Themen 2
X JDK installieren Weiß jemand, wie ich GCJ (WINDOWS) installieren und anwenden kann? Allgemeine Java-Themen 11
D JRE in .jar verpacken unter Windows Allgemeine Java-Themen 4
I Programm im Hintergrund bei Windows zur Steuerung der Tastatur nutzen Allgemeine Java-Themen 2
D Aktuell installierte Java Version auslesen unter Windows Allgemeine Java-Themen 5
S Executable Jar File startet nicht unter Windows 10 Allgemeine Java-Themen 3
C Windows RCP Application unter Linux bauen lassen Allgemeine Java-Themen 3
E Anwendung verhält sich unter Mac anders als Unter Windows. Allgemeine Java-Themen 4
S JNLP startet seit 1.8.0_31 sehr langsam + Windows-Systemverzeichnis Allgemeine Java-Themen 3
M Windows 98 - Mit welchem JDK (Version) kann noch Programm dafür erstellt werden Allgemeine Java-Themen 6
Tom299 Beliebiges Windows-Programm / Prozess in den Vordergrund bringen Allgemeine Java-Themen 4
D Konsoleneingabe ist in Windows CMD nicht sichtbar Allgemeine Java-Themen 4
P Effizientes Programmieren - oder Windows Autostart fürs Herunterfahren Allgemeine Java-Themen 11
O Zugriff auf Windows Zertifikatstore Allgemeine Java-Themen 2
F Windows Umlaute Allgemeine Java-Themen 15
T Windows-Kontextmenü Eintrag hinzufügen? Allgemeine Java-Themen 3
O Socket-Unterschiede zwischen Windows und Ubuntu Allgemeine Java-Themen 2
G Wie installiere ich javax-usb unter windows? Allgemeine Java-Themen 0
M Swing Windows und Ubuntu Allgemeine Java-Themen 4
H JFileChooser soll NUR Windows-Netzwerkumgebung anzeigen Allgemeine Java-Themen 2
L Windows CMD werte Parsen. Allgemeine Java-Themen 2
M Code läuft unter windows aber nicht unter Linux Allgemeine Java-Themen 6
HarleyDavidson Tomcat VS Windows Scheduled Task Allgemeine Java-Themen 4
T JNI: kein Zugriff auf VM in Callback-Methode eines Windows-Hooks Allgemeine Java-Themen 3
W Windows (Service) Hooking Allgemeine Java-Themen 8
M Java auf Linux und Windows Allgemeine Java-Themen 6
R Windows-Firewall lässt Java nicht durch Allgemeine Java-Themen 17
R Java-Progamm über Icon starten unter Windows Allgemeine Java-Themen 9
N Input/Output Mit Windows 7 erzeugtes zip-File in Java 7 öffnen Allgemeine Java-Themen 5
P Eclipse Unter Windows erstelle .jar unter Linux (Ubuntu) funktioniert nicht Allgemeine Java-Themen 5
R ZIP FileSystem unter Windows wirft exception Allgemeine Java-Themen 7
njans Windows Verknüpfung von Icon Allgemeine Java-Themen 2
P windows mit java bedienen Allgemeine Java-Themen 8
X Windows-Environment-Variable per jRegistryKey anpassen Allgemeine Java-Themen 6
P .Jar Datein Windows Konsole zugewiesen Allgemeine Java-Themen 3
C Encoding Problem Windows Allgemeine Java-Themen 9
L Input/Output ProcessBuilder und Windows - Konsole verbergen? Allgemeine Java-Themen 5
R Welches User-Verzeichnis wählen für Configurationsdateien - Windows Allgemeine Java-Themen 2
R Änderungen in einem Verzeichnis beobachten - Windows Allgemeine Java-Themen 3
A Nach Benutzerwechsel mit anderem Account in Windows anmelden Allgemeine Java-Themen 8
T Jar File läuft unter Windows aber nicht unter linux Allgemeine Java-Themen 10
B Windows Konsolenbefehle Allgemeine Java-Themen 3
Z Probleme bei Stringvergleichen (Windows/Linux) Allgemeine Java-Themen 10
B Windows Shutdown abfangen Allgemeine Java-Themen 10
E CMD Registry Key für Windows 7? Allgemeine Java-Themen 9
TiME-SPLiNTER vlcj und Windows Allgemeine Java-Themen 15
S Prozess der von anderem Prozess gestartet wurde beenden? (Windows Bildschirmtastatur) Allgemeine Java-Themen 4
G Input/Output URLDecoder.decode - Unterschiedliche Ergebnisse Windows / Linux Allgemeine Java-Themen 2
R Windows ermitteln ob Administratorrechte vorhanden Allgemeine Java-Themen 17
Y MenuBar -> Windows / Mac OS X Allgemeine Java-Themen 2
L Java Quellcode auf Windows 7 ausführen? Allgemeine Java-Themen 3
I Encoding Problem bei exec und Windows Allgemeine Java-Themen 2
R Windows - User Passwort ändern Allgemeine Java-Themen 2
F java prog als windows-dienst. Erfahrungen? Allgemeine Java-Themen 2
R Dateien vom Windows-Explorer zum Programm senden Allgemeine Java-Themen 21
H Standard Windows-Druck-Dialog Allgemeine Java-Themen 2
S Windows "öffnen mit..." Allgemeine Java-Themen 4
D Clipboard getSystemSelection() funktioniert unter Windows* nicht Allgemeine Java-Themen 3
M Nach Programmdurchlauf werden Zeichen falsch dargestellt + Anderes Verhalten unter Windows Allgemeine Java-Themen 6
P Windows Media Player starten / finden Allgemeine Java-Themen 2
D Windows-Konsole auslesen - Zeichenkodierung Allgemeine Java-Themen 4
J Path-Eintrag unter Windows 7 Allgemeine Java-Themen 11
Q .jar wird mit cmd gestartet - Zuordnung von Dateitypen ändern (Windows 7) Allgemeine Java-Themen 7
G jad JDK1.6 Windows 7 Allgemeine Java-Themen 2
Z Position/Größe von Windows-Fenstern ermitteln Allgemeine Java-Themen 12
Z Probleme mit Java unter Vista/ Windows 7 Allgemeine Java-Themen 12
O Jar-Datei auf Windows 98 Allgemeine Java-Themen 6
K Windows Fehlerkanal -> Ausgabe in Datei Allgemeine Java-Themen 6
M Runtime.getRuntime().exec(cmd); auf windows ... Allgemeine Java-Themen 2

Ähnliche Java Themen


Oben