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:
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.
|