kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Anlegen einer Java-Native-Methode zur Ansteuerung des Parallel-Ports

  • Das Verfahren soll an einem Beispiel in kurz beschriebenen Schritten dargestellt werden.

1. Java-Quellcode schreiben:

public class Parallelport
{
    static 
    {
        //Laden der dynamischen Bibliothek von /mnt-system.
        //Die dynamische Bibliothek muß vorher dorthin kopiert worden sein! 
        System.load("/mnt-system/parallellib.so");
    }
    public static native void sende(int zahl);
}

Code 0-1: Java-Quelltextdatei Parallelport.java

  • Obiges Programm lädt über den Befehl System.load(..) eine noch zu erstellende dynamische Bibliothek, die die System-spezifischen Elemente der nativen Funktion enthält.
  • Die native Java-Methode, erhält das Schlüsselwort native und wird nicht implementiert.

2. Quelltext kompilieren:

  • javac Parallelport.java

3. Automatisch Header-Datei für C-Funktion erzeugen:

  • javah -jni -o parallel.h Parallelport

4. Aus parallel.h Funktionskopf für selbst zu schreibenden C-Quellcode in parallel.c auslesen:

#include<jni.h>
#include "parallel.h"
#include<sys/io.h>
JNIEXPORT void JNICALL Java_Parallelport_sende(JNIEnv *env, jclass clazz, jint zahl)
{
    ioperm(0x378, 3, 1);
    outb(zahl,0x378);
}

Code 0-2: C-Quellcode parallel.c entsprechend dem Funktionskopf in parallel.h

  • Das JNI-Framework (Java-Native-Interface) bietet besondere Objekte und Datentypen zum Austausch zwischen der Java-Methode und der nativen Methode.
  • jint entspricht beispielsweise dem Datentyp signed long mit 32Bit.
  • *env kann der Native Funktion z.B. ermöglichen den Klassentyp der aufrufenden Methode zu bestimmen.
  • clazz erlaubt es auf Attribute der dem Aufrufer zugeordnenten Klasse zu bekommen.
  • In dem hier behandelten einfachen Programm werde *env und clazz nicht benutzt.

5. Dynamische Bibliothek parallel.so mit Hilfe von gcc aus parallel.c und parallel.h erzeugen:

  • gcc -o parallellib.so -shared -Wl,-soname,parallel.so -I/KNOPPIX-DATA/usr/lib/jvm/java-6-sun-1.6.0.22/include -I/KNOPPIX-DATA/usr/lib/jvm/java-6-sun-1.6.0.22/include/linux parallel.c -static -lc
  • Die absoluten Pfade in obigem Befehl müssen an die jeweilige Plattform angepaßt werden.

6. Entstandene Library parallellib.so auf die oberste Ebene des USB-Sticks kopieren.

  • ..dann ist sie verfügbar unter dem absoluten Pfad /mnt-system/parallellib.so

7. Testklasse schreiben:

public class Main
{
    public static void main(String[] args)
    {
        while(true)
        {
            Parallelport.sende(1+4+16+64);
            try
            {
                Thread.sleep(1000);
            }
            catch(Exception e)
            {
            }
            Parallelport.sende(2+8+32+128);
            try
            {
                Thread.sleep(1000);
            }
            catch(Exception e)
            {
            }
        }
    }
}

Code 0-3: Beispielanwendung der nativen Methode.

parallel.zip - Download obiger Beispiele.
Übung
  • Bauen Sie die Testschaltung für den Parallelport nach.
  • Führen Sie eine Geschwindigkeitsoptimierung für das C und das Java-Programm durch.
  • Überprüfen Sie in geeigneter Weise die Performance des C- und des Java-Programms: Was ist jeweils die maximale Frequenz eines auf den Ausgangsport geschickten Rechtecksignals?
  • Überprüfen Sie die Möglichkeit einen Servo direkt an den Parallelport anzuschließen und realisieren Sie im Fall, dass der Parallelport nicht gefährdet ist eine entsprechnede Testanordnung mit Servo.