19.04. Zugriff von C nach Java
Mit JNI können Sie nicht nur nativen Code in Java ausführen, es ist auch der umgekehrte Weg möglich: Sie können in einer nativen Bibliothek Methoden von Klassen und Objekten aufrufen und Attribute auslesen oder setzen.
Mit JNI können Sie nicht nur nativen Code in Java ausführen, es ist auch der umgekehrte Weg möglich: Sie können in einer nativen Bibliothek Methoden von Klassen und Objekten aufrufen und Attribute auslesen oder setzen.
Java ME Programme werden immer als JAR-Datei mit Manifest ausgeliefert. Jedoch unterscheidet sich das Manifest in manchen Punkten vom Desktop-Derivat. Zusätzlich wird das Manifest noch leicht modifiziert als so genannte JAD-Datei (Java Application Descriptor) erzeugt. Dabei sollte die Größe der JAR-Datei so kompakt wie möglich gehalten werden. Diese Techniken werden Ihnen in diesem Kapitel näher gebracht.
Sie haben bereits im Kapitel 01.02 Einsatzgebiete von Java etwas über die Java Micro Edition (Java ME) erfahren. In den nachfolgenden Kapiteln werden Sie lernen, wie Sie Anwendungen und Spiele für Mobile Endgeräte entwickeln.
Wenn Sie editierbaren Text in Java darstellen möchten, haben Sie mehrere Möglichkeiten. Sie können bspw. eine JTextArea oder ein JTextField verwenden und simple Formatierungen daran vornehmen, die das komplette Textfeld betreffen (bspw. die Hintergrundfarbe oder Schrift verändern). Sollen sich bestimmte Textabschnitte voneinander unterscheiden, haben Sie zuerst einmal ein Problem, weil das mit einer JTextArea oder einem JTextField nicht funktioniert. Eine Alternative wäre es, HTML in einem JEditorPane darzustellen. Die Editierbarkeit ist in diesem Fall jedoch stark eingeschränkt. Es gibt noch eine weitere Möglichkeit: Sie können ein javax.swing.JTextPane mit einem eigenen javax.swing.text.StyledDocument versehen. Diese Variante wird Ihnen in diesem Kapitel vorgestellt.
Nachdem Sie bereits ein einfaches JNI Beispiel erstellt und erfolgreich ausgeführt haben, steigen wir in diesem Kapitel ein wenig tiefer in die Materie ein. Wir beschäftigen uns mit Übergabeparameter von Java an eine native Bibliothek und dem Rückgabewert der nativen Bibliothek an Java.
In den letzten Kapiteln haben Sie gelernt, wie man Daten speichert. Jetzt stellt sich noch die Frage, wo und in welcher Form Anwendungsdaten (Daten, die der Benutzer anlegen und laden kann, sollten natürlich an einem frei wählbarem Ort in einer passenden Form hinterlegt werden) gespeichert werden sollten. Für den Ort bieten sich relative Pfade oder besser Preferences an. Als Form lernen Sie in diesem Kapitel Properties kennen. Daneben gibt es noch XML und Datenbanken (ggf. mit Persistence-Schicht) als häufige Speicherformen. Diesen werden aber zu einem späteren Zeitpunkt jeweils ein komplettes Kapitel gewidmet.
In Java haben Sie nicht nur die Möglichkeit einfache Datenstrukturen wie Bytes und Zeichenketten zu schreiben und lesen, Sie können auch komplette Objekte durch Streams schicken. Hierzu verwendet man die Klassen java.io.ObjectOutputStream und java.io.ObjectInputStream, welche ich Ihnen in diesem Kapitel vorstellen werde.
Ein Zeichen wird immer als Code aus Bits und Bytes gespeichert. Je nach Einsatzort oder Herkunft kann dieser Code für identische Zeichen anders aussehen. Deshalb ist es wichtig die Zeichencodierung (charset) einer Zeichenkette zu kennen. Häufig eingesetzte Codierungen sind bspw. UTF-8 oder ISO-8859-1.
Sie haben bereits mehrfach mit der Standardausgabe System.out.println gearbeitet. Dieser Stream muss jedoch nicht zwingend auf der Konsole ausgegeben werden. In diesem Kapitel lernen Sie, wie Sie die Standardausgabe umleiten und Text von der Konsole einlesen.
Im letzten Kapitel haben Sie gelernt, wie Sie Text in einer Textdatei speichern können. Aber natürlich gibt es noch viel mehr Arten von Daten als Texte. Bilder und Musik liegen bspw. nicht als geschriebener Text, sondern in binärer Form vor. In diesem Fall greifen Sie auf java.io.FileInputStream anstelle von java.io.FileReader und java.io.FileOutputStream anstelle von java.io.FileWriter zu. Der Hauptunterschied liegt darin, dass Bytes anstelle von Zeichen verarbeitet werden. Die Handhabung ist hingegen weitestgehend identisch – Sie können sogar mittels java.io.BufferedInputStream und java.io.BufferedOutputStream die Streams wie im vorhergehenden Kapitel puffern.