AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [Java] Win32 API aus Java aufrufen?

[Java] Win32 API aus Java aufrufen?

Ein Thema von Mazel · begonnen am 20. Jun 2008 · letzter Beitrag vom 20. Jun 2008
Antwort Antwort
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#1

[Java] Win32 API aus Java aufrufen?

  Alt 20. Jun 2008, 13:33
Hallo,

ich möchte gerne eine Win32 API, zum Beispiel GetSysColor, aus Java aufrufen. Nun habe ich mich ein wenig belesen und herausgefunden, dass ich das JNI (Java Native Interface) nutzen muss. Gleichzeitig habe ich aber auch erfahren, dass die DLL (in diesem Fall die User32.dll) für das JNI vorbereitet sein muss, was sie sicher nicht ist, zumindest gehe ich davon aus. Ich habe schon zahlreiche Websiten gefunden, die sich mit dem Thema befassen, aber aufgrund fehlender Programmierkentnisse in Java ist es mir nicht gelungen, eine Lösung zu finden. Auch wenn mir die Erfahrungen fehlen, würde ich gerne auf eine Win32 API über Java zugreifen können und natürlich verstehen wollen was passiert.

Deshalb stellt sich die Frage: Wie kann ich solch eine Funktion in Java nutzen?

Auf der Website von Microsoft habe ich über JDirect erfahren, doch weis ich nicht wie ich das package einbinden muss.

Wenn jemand eine Lösung weis, würde ich mich freuen.

Danke
Mazel
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: [Java] Win32 API aus Java aufrufen?

  Alt 20. Jun 2008, 13:46
So was habe ich auch schon gemacht. Guck mal, ob dir mein Artikel dazu hilft: http://www.michael-puff.de/Artikel/2...HelloWorld.php
Aber ich glaube, das ist der umgekehrte Weg, wenn ich mir das so durchlese.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.270 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: [Java] Win32 API aus Java aufrufen?

  Alt 20. Jun 2008, 13:50
[OT] Darf ich mal doof fragen, wieso man eine Programmiersprache benutzt, die im Allgemeinen wohl hauptsächlich wegen ihrer Plattformunabhängigkeit verwendet wird, um dann auf plattformabhängige Funktionen zurückgreifen zu wollen? Das soll keine Ironie sein, sondern interessiert mich tatsächlich. [/OT]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: [Java] Win32 API aus Java aufrufen?

  Alt 20. Jun 2008, 14:01
Hi,

an sich hast Du schon das wichtigste Element gefunden/benannt, das Java Native Interface. Das erlaubt einem den Zugriff auf native Funktionen, man verlässt also an dieser Stelle die Plattformunabhängigkeit. Deshalb gleich vorweg, sollte man hier besonders darauf achten, dass so ein Zugriff nur für eine bestimmte Plattform(en) stattfinden kann/darf.

An sich ist das JNI ziemlich einfach aufgebaut (erinnert an viele andere Foreign-Function-Interfaces). Es wird die Möglichkeit angeboten, dass man dynamische Bibliotheken mit einer C - Aufrufkonvention aus der JVM heraus verwenden kann (und vice versa). Auch die Elemente, die dabei zur Verfügung stehen sind direkt aus C nutzbar (also Strukturen statt Klassen und Variablen zur Identifizierung eines bestimmten Exemplars).

Auch hast Du recht, dass man ein paar Vorbereitungen treffen muss. So findet der Aufruf aus der VM immer so statt, dass mindestens zwei Variablen übergeben werden. Die eine verweist dabei auf das Environment, dass den Aufruf gestartet hat, die andere enthält eine Referenz auf die Aufrufende Klasse (this-Zeiger). Natürlich handelt es sich nur um Entsprechungen (gibt ja keine Klassen in C).
Nötig ist das ganze, da beim Aufruf nativer Methoden Java nicht mehr die Speicherverwaltung übernehmen kann. Würde die Garbage Collection ein Datum im Speicher verschieben, so würde ein Zeiger auf C - Seite natürlich ins leere (oder schlimmer wo anders hin) zeigen, das Verhalten wäre entsprechend undefiniert. Ebenso kann Java nicht mehr bestimmen, wann eine Variable nicht mehr benötigt wird (außerhalb der VM ist ja keine Referenzzählung durch Java möglich). Entsprechend musst Du also auch darauf achten, dass Du den verwendeten Speicher wieder frei gibst!

So, der Rest ist dann (eigentlich) recht einfach. Alles was Du tun musst um eine "nicht-vorbereitete" Bibliothek zu verwenden ist einen Wrapper (z.B. in C) schreiben. Der muss eben alle Funktionen, die Du verwenden möchtest implementieren, wobei Du immer mit den zwei genannten Argumenten beginnst (siehe http://java.sun.com/j2se/1.5.0/docs/...gn.html#wp9502). Die anderen Argumente musst Du in der Java - Entsprechung definieren (siehe http://java.sun.com/j2se/1.5.0/docs/...es.html#wp9502).
Ja, dann eben noch die Daten entsprechend an die tatsächliche Implementierung weiterreichen (also die ersten beiden Argumente ignorieren, die anderen Daten konvertieren und die "echte" Funktion aufrufen, Ergebnis rückkonvertieren und natürlich Speicher frei geben). Am Besten fängst Du einfach mit einer wirklich einfachen (eigenen) DLL an, in der Du z.B. einfach nur eine Zahl mit 2 multiplizierst und das Ergebnis zurück gibst. Wenn Du das gut in Java einbinden kannst, dann ist der Rest nur noch lesen der Doku und ggf. ein wenig probieren (und natürlich erneutes Nachfragen, falls es noch Probleme gibt).

Gruß,
Der Unwissende
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#5

Re: [Java] Win32 API aus Java aufrufen?

  Alt 20. Jun 2008, 14:13
[OT]
Zitat von DeddyH:
Darf ich mal doof fragen, wieso man eine Programmiersprache benutzt, die im Allgemeinen wohl hauptsächlich wegen ihrer Plattformunabhängigkeit verwendet wird, um dann auf plattformabhängige Funktionen zurückgreifen zu wollen? Das soll keine Ironie sein, sondern interessiert mich tatsächlich.
Auch wenn ich jetzt nicht für jmd. anderen antworten möchte, bin ich mal so frei auch eine Antwort zu der Frage zu posten:
An sich gibt es ein paar gute Gründe. Die Sprache Java lebt (imho) nicht nur von der Plattformunabhängigkeit, sondern auch von guten, kostenlosen IDEs, ein gutes Sprachdesign, eine große Community und jede Menge Bibliotheken und Frameworks. An sich also schon mal ein möglicher Grund Java zu verwenden.
Natürlich hast Du recht, ein weiterer (wichtiger) Aspekt ist sicher die Plattformunabhängigkeit. Für die reine Programmlogik ist es sicher an vielen Stellen ganz nett, dass man (ohne neu zu kompilieren oder was zu verändern) eine Applikation auf einer anderen Plattform starten kann. Allerdings möchte man natürlich auch nicht unnötig anders sein, als die nativen Anwendungen. Dazu gehört die (mittlerweile ganz ordentliche) Perfomance genauso wie das Verhalten und Erscheinungsbild. Es gibt ja z.B. immer wieder gerne Anwendungen, die unter Windows im Laufwerk "C:\" und "Program Files" etwas ablegen wollen. Etwas blöd wenn bei einem dt. (oder nicht englischen) Windows, noch blöder wenn unter "C:\" gar kein Laufwerk zu finden ist (z.B. bei den Asus-Pundits für Compact - Flash Platten reserviert). Hier ist es immer schöner, wenn man den korrekten Pfad ermittelt. Genauso kann man natürlich einen bestimmten Schlüssel in der Registry suchen wollen, die Registry dürfte man aber auf anderen Systemen vergeblich suchen. Hier ist es natürlich eine schöne Möglichkeit, dass man die Anwendung entsprechend anpasst und in Abhängigkeit von der Plattform einen Pfad / Schlüssel-Wert über eine native Funktion ermittelt.

Natürlich kann es für die hier genannten, fiktiven Beispiele bessere Alternativen für Java geben, aber nicht immer ist die Alternative bereits verfügbar. Auch noch ganz wichtig, es kann ja auch mal nötig sein, dass eine Java - Applikation auf z.B. ein Dongle (allgemeiner auf HW) zugreifen soll, da kann man natürlich auch nicht für alles eine plattformunabhängige Kapselung finden (da teilweise schon nicht alle Plattformen unterstützt werden).

[/OT]
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#6

Re: [Java] Win32 API aus Java aufrufen?

  Alt 20. Jun 2008, 14:23
@Luckie:
Danke, leider hat mir das nicht geholfen. Als ich das Forum durchsucht habe, bin ich auch schon auf deine HelloWorld.zip gestoßen.

@Der_Unwissende:
Recht vielen Dank an den, so wie es mir scheint, "wissenden" Unwissenden .

Es sieht für mich ziemlich kompliziert aus, denn ich muss Header Dateien (.h) und C Dateien (.c) erstellen und das alles noch zusammenführen.

In der Zwischenzeit habe ich noch mehr gefunden und zwar JNA (Java Native Access), auch das schau ich mir mal genauer an.

@DeddyH:
Normal würde ich das was ich vorhabe in Delphi realisieren. Nun ist es aber so, dass 1. auf dem Rechner an dem ich zur Zeit arbeite kein Delphi installiert ist, 2. es auch nicht installiert werden soll und 3. ich Java lernen soll/muss.
Ich habe eben ein Aufgabe, die ich erstmal versuchen will in Java umzusetzten, auch wenn es auch länger dauert und eventuell doch nicht klappt, weil einfach die Erfahrung fehlt. Es geht einfach darum, dass ich mich mit Java auseinander setzte.
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.270 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: [Java] Win32 API aus Java aufrufen?

  Alt 20. Jun 2008, 14:38
@Der_Unwissende: Danke für Deine Erläuterungen, das kann ich nachvollziehen.

@Mazel: Du sollst/musst Java lernen. Da finde ich es gerade falsch, an alten Gewohnheiten festzuhalten, da Java nunmal keine reine Win32-Sprache ist. Ich will Dir nichts vorschreiben, aber an Deiner Stelle würde ich mich zunächst mit den Möglichkeiten und Grenzen von Java auseinandersetzen, bevor ich versuchen würde, diese Grenzen zu überwinden.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#8

Re: [Java] Win32 API aus Java aufrufen?

  Alt 20. Jun 2008, 17:19
Was das angeht muss ich dir auch Recht geben. Ja, es ist so, dass ich das eigentlich über Delphi realisieren wollte. Nun ist das aber nur auf einem Rechner installiert auf den ich kein Zugriff habe. Aber Java kann ich mit Hilfe von Eclipse ausführen und ich wollte einfach für mich selber schauen, ob es möglich ist, das was ich mit Delphi realiseren wollte auch mit Java kann.

Es wurde nicht festgelegt mit welcher Umgebung ich arbeiten soll, machen tu ich es aber zu Hause auch in Delphi. Nur eben auf Arbeit ist es nicht anders möglich.

Mitlerweile klappt der Aufruf mit Hilfe von JNA.
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 20:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf