RuZman

5337

Illustration

Abstract

Neben C, C++, Objective-C, Python, etc. stellt die Leap Motion auch für Java eine Schnittstelle bereit. In diesem Artikel wird ein Ansatz gezeigt, wie das Leap Motion Java SDK installiert wird. Ziel ist möglichst plattformunabhängig zu bleiben und gleichzeitig die Hardware zu abstrahieren. Dafür wird eine programmtechnische Lösung in Java gewählt.

Min. Systemvoraussetzung

Vorbereitung

Native Libraries einbinden

Das Java Native Interface (JNI) ist eine standardisierte Schnittstelle, um aus einem Java-Program auf plattformspezifische Funktionen zuzugreifen. Alle nativen Libraries sind im "Java Library Path" gespeichert und gelten für jeweils einen Prozess.

Beim Programmstart kann der Anwender seine eigenen nativen Libraries über den Parameter -Djava.library.path= einreichen. Nachträgliche Manipulationen der Property java.library.path akzeptiert die JVM nicht. Dieser Weg wird in der offiziellen Dokumentation Setting up a Java project beschrieben. Im Gegensatz dazu steht die programmtechnische Lösung, welche zur Laufzeit die Plattform bestimmt und beim Programmstart die relevanten Libraries läd. Mit dem folgendem Code wird die JVM gezwungen seine Pfade zu revalidieren, sodass neue Einträge in der java.library.path übernommen werden:

Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
fieldSysPath.setAccessible(true);
fieldSysPath.set(null, null);

Den Hintergrund erklärt Fahd Shariff in seinem Blog-Post Changing Java Library Path at Runtime. Da es sich um ein allgemeines Problem handelt, bietet sich eine Klasse wie z.B. NativeLibrary.java an. Diese stellt Methoden zur Verfügung, um zur Laufzeit native Libraries nachzuladen.

Eclipse - Leap Motion

  1. Neues Java Projekt anlegen. File → New → Java Project:
    Eclipse New Project
  2. Beliebigen Projektname wählen:
    Eclipse New Projectname
  3. Next-Button betätigen:
    Eclipse Next-Button
  4. In den Tab "Libraries" wechseln und dort den "Add External JAR"-Button betätigen:
    Eclipse Libraries
  5. Die JavaLeap.jar selektieren, die bei den Vorbereitungen in den deployment-Ordner gelegt wurde.
  6. Finish-Button betätigen:
    Eclipse Finish-Button
  7. Den native-Ordner aus dem deployment-Ordner in das Projekt-Verzeichnis kopieren:
    Eclipse Folder
  8. Die Klasse NativeLibrary.java ins Projekt kopieren (oder in eine Toolkit-Library)
  9. Main-Klasse erstellen und die Bibliothek laden:
    public class Main {
       public static void main(String[] args) {
          if (NativeLibrary.loadSystem("native")) {
             System.out.println("Libraries successful loaded.");
             // Leap Motion Projekt ...
          }
       }
    }

Netbeans - Leap Motion

  1. Neues Projekt anlegen. File → New Project:
    Netbeans New Project
  2. Java-Application selektieren:
    Netbeans Java Application
  3. Next-Button betätigen:
    Netbeans Next-Button
  4. Beliebigen Projektnamen wählen:
    Netbeans Projectname
  5. Finish-Button betätigen:
    Netbeans Finish-Button
  6. Rechtsklick auf das Projektverzeichnis → Properties wählen:
    Netbeans Project Properties
  7. Unter der Kategorie "Library" den "Add JAR/Folder"-Button betätigen:
    Netbeans Add JAR/Folder
  8. Die JavaLeap.jar selektieren, die bei den Vorbereitungen in den deployment-Ordner gelegt wurde.
  9. Den native-Ordner aus dem deployment-Ordner in das Projekt-Verzeichnis kopieren:
    Netbeans Folder
  10. Die Klasse NativeLibrary.java ins Projekt kopieren (oder in eine Toolkit-Library)
  11. Main-Klasse erstellen und die Bibliothek laden:
    public class Main {
       public static void main(String[] args) {
          if (NativeLibrary.loadSystem("native")) {
             System.out.println("Libraries successful loaded.");
             // Leap Motion Projekt ...
          }
       }
    }

Fazit

Im Großen und Ganzen entspricht der programmtechnische Lösung meiner Meinung nach eher der Java-Philosophie als dem Anwender das Eintragen der Systembibliotheken zu überlassen. Da es nach meiner Recherche keine bessere Alternative gibt, belasse ich es erst einmal bei dieser Lösung.