Leap Motion Java SDK - Installation
Zoltan Ruzman 5287
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
- Windows 7, Ubuntu 12.04 oder Mac OS X 10.7
- AMD Phenom II oder Intel Core i3
- 2GB RAM
- JDK 6
Vorbereitung
- Leap Motion Treiber installieren
- Kostenlos als Leap Motion Developer registrieren
- Leap Motion Developer SDK für Windows, OS X und Linux downloaden
- Folgende Verzeichnisstruktur anlegen und relevante Dateien kopieren:
-
-
- LeapMotion.jar (aus Win-LeapSDK/lib)
-
-
- libLeap.dylib (aus Mac-LeapSDK/lib)
- libLeapJava.dylib (aus Mac-LeapSDK/lib)
-
-
- libLeap.so (aus Linux-LeapSDK/lib/x32)
- libLeapJava.so (aus Linux-LeapSDK/lib/x32)
-
- libLeap.so (aus Linux-LeapSDK/lib/x64)
- libLeapJava.so (aus Linux-LeapSDK/lib/x64)
-
-
-
- libLeap.dll (aus Win-LeapSDK/lib/x32)
- libLeapJava.dll (aus Win-LeapSDK/lib/x32)
-
- libLeap.dll (aus Win-LeapSDK/lib/x64)
- libLeapJava.dll (aus Win-LeapSDK/lib/x64)
-
-
-
-
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
- Neues Java Projekt anlegen. File → New → Java Project:
- Beliebigen Projektname wählen:
- Next-Button betätigen:
- In den Tab "Libraries" wechseln und dort den "Add External JAR"-Button betätigen:
- Die JavaLeap.jar selektieren, die bei den Vorbereitungen in den deployment-Ordner gelegt wurde.
- Finish-Button betätigen:
- Den native-Ordner aus dem deployment-Ordner in das Projekt-Verzeichnis kopieren:
- Die Klasse NativeLibrary.java ins Projekt kopieren (oder in eine Toolkit-Library)
- 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
- Neues Projekt anlegen. File → New Project:
- Java-Application selektieren:
- Next-Button betätigen:
- Beliebigen Projektnamen wählen:
- Finish-Button betätigen:
- Rechtsklick auf das Projektverzeichnis → Properties wählen:
- Unter der Kategorie "Library" den "Add JAR/Folder"-Button betätigen:
- Die JavaLeap.jar selektieren, die bei den Vorbereitungen in den deployment-Ordner gelegt wurde.
- Den native-Ordner aus dem deployment-Ordner in das Projekt-Verzeichnis kopieren:
- Die Klasse NativeLibrary.java ins Projekt kopieren (oder in eine Toolkit-Library)
- 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.