INE2 – Informatik für Ingenieure 2 Praktikum 13: Java Native Access Aufgabe 1: Aufruf einer Betriebssystem Funktion Das Betriebssystem ist über DLL Aufrufe direkt ansprechbar; das beinhaltet auch Funktionen, die in Java nicht über die Klassenbibliothek verfügbar sind. Eine dieser Funktionen ist das Sperren des Computers Aufgabe: Sperren Sie Ihren Zugriff auf ihren Computer Hinweise: • • • Entsprechende Vorlesungsfolie Das jna-4.1.0.jar File finden Sie in ihrem arduino/lib Verzeichnis oder im Internet. Es muss als zusätzliche Bibliothek im Java Projekt angegeben werden. Aufgabe 2: Zugriff auf die C Ranglisten DLL Die Rangliste, die als C DLL entwickelt wurde soll via Java Zugegriffen werden. Für diesen Zweck muss zuerst das Teilnehmer struct typedef struct { char name[20]; int h, min, sec; } Teilnehmer; die entsprechende Java Datenstruktur sieht folgendermassen aus. public class Teilnehmer extends Structure { public byte[] name = new byte[20]; public int h; public int min; public int sec; } Du C Funktionen der DLL haben folgende Signatur void teilnehmerLaden(char* filename, int *maxT, Teilnehmer zeiten[]); void teilnehmerSpeichern(char* filename, int maxT, Teilnehmer zeiten[]); void teilnehmerSortieren(int size, Teilnehmer zeiten[]); Diese werden wie folgt in Java abgebildet void teilnehmerLaden(String filename, IntByReference maxT, Teilnehmer[] zeiten); void teilnehmerSpeichern(String filename, int maxT, Teilnehmer[] zeiten); Karl Rege, Gerrit Burkert, 23.05.16 1 INE2 – Informatik für Ingenieure 2 void teilnehmerSortieren(int size, Teilnehmer[] zeiten); Der Array von Teilnehmer muss vor der Übergabe noch in einen zusammenhängenden Memory Block kopiert werden, was die Hilfsmethode toContinuousArray übernimmt. Teilnehmer[] tn = Teilnehmer.toContinuousArray(myArray); Der Pointer zu einem int wird duch einen IntByRefernce repräsentiert. Das fertige JNA Interface sieht wie folgt aus: public interface RanglisteModel extends Library { RanglisteModel INSTANCE = (RanglisteModel) Native.loadLibrary("libRanglisteModel" ,RanglisteModel.class); // void printf(String format, Object... args); void teilnehmerLaden(String filename, IntByReference maxT, Teilnehmer[] zeiten); void teilnehmerSpeichern(String filename, int maxT, Teilnehmer[] zeiten); void teilnehmerSortieren(int size, Teilnehmer[] zeiten); } Der Aufruf via sieht dann wie folgt aus: final int SIZE = 100; Teilnehmer[] myArray = new Teilnehmer[SIZE]; myArray[0] = new Teilnehmer("hugo",4,3,1); Teilnehmer[] tn = Teilnehmer.toContinuousArray(myArray); RanglisteModel.INSTANCE.teilnehmerSpeichern("c:\\tmp\\t.txt", tn.length,tn); Aufgabe: erstellen Sie eine Rangliste mit 3 Elementen; sortieren Sie diese und speichern Sie die sortierte Rangliste ab.. Hinweise: • • Die libRanglisteModel-DLL muss sich im build/classes Verzeichnis Ihres Projekts befinden und muss den angegebenen Namen haben Das LIB File wird nicht benötigt Karl Rege, Gerrit Burkert, 23.05.16 2