Einzelnen Beitrag anzeigen

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, 13: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