# Java Web Start - Native DLL einbinden



## Matthias123 (2. Mrz 2010)

Hallo allerseits,

Ich habe hier ein USB-Gerät (Lampe), dass ich mit Java anspreche.
Mit einer Desktop-Application funktioniert alles prima, aber ich möchte die Lampe gerne aus dem Browser heraus ansprechen. Erst habe ich es mit einem Applet versucht und hier auch einen Thread diesbezüglich erstellt. Daran bin ich aber gescheitert.

Deswegen habe ich es jetzt mit Web Start versucht.
Vorher habe ich mich natürlich ausreichend über Google informiert, wie das möglich ist.
Und eigentlich sollte es auch möglich sein, wenn man im JNLP Code die native library als .jar Datei einfügt.
Aber mittlerweile bin ich schon richtig am verzweifeln, weil ich schon länger als eine Woche am Rumprobieren bin und es einfach nicht will.
Ich bekomme einen Error in der Konsole, dass ich eine native Methode anspreche. Aber ich dachte das dürfte ich mit Java Web Start. Die beiden .jar Dateien sind übrigens mit dem gleichen Key signiert.

Error:


> java.lang.UnsatisfiedLinkError: iface.Open(ILjava/lang/String;Ljava/lang/String;II)J
> at iface.Open(Native Method)
> at UsbConnect.<init>(UsbConnect.java:26)
> at UsbConnect.main(UsbConnect.java:42)
> ...




So sieht meine Main Klasse aus:

```
public class UsbConnect {

    public UsbConnect() {

       try{
            iface.load(); //USB-Klasse wird initialisiert
       }catch(Exception e){
            System.out.println("Error beim Laden der jpicusb.dll.");
            System.out.println(e.getMessage());
            return;
       }

      try {
            byte[] sendData = new byte[128];
            sendData[0] = 1;
            sendData[1] = 30;

          //USB Verbindung aufbauen
          long myOutPipe = iface.Open(0, "vid_01a2&pid_ce12", "\\MCHP_EP1", iface.MP_WRITE, 0);

          // Befehl senden
          long SetSpeedTo = iface.Write(myOutPipe, sendData, 2, 100);

          // schließen
          boolean Offline = iface.Close(myOutPipe);

        } catch (Exception ex) {
            System.out.println("ERROR:" + ex.getMessage());
        }

    }

    public static void main(String args[]) {
        new UsbConnect();
    }
}
```


Und das ist die jPicUsb Klasse, die die nativen Methoden verwendet:

```
public class iface
{
  private static final Exception exFileNotFound = new Exception("jpicusb.dll konnte nicht geladen werden");
  private static final Exception exSecurity = new Exception("Security Exception mit jpicusb.dll");
  private static final Exception exAlreadyLoaded = new Exception("jpicusb.dll wurde schon geladen");
  private static String ifaceLoaded = "USB Interface geladen";

  private static int libLoaded = 0;

  // [...] //noch mehr static Variablen

  public static int MP_WRITE = 0;


  public static native long Open(int paramInt1, String paramString1, String paramString2, int paramInt2, int paramInt3);

  public static native boolean Close(long paramLong);

  public static native long Write(long paramLong1, byte[] paramArrayOfByte, int paramInt, long paramLong2);

  public static native long Write(String paramString, int paramInt1, byte[] paramArrayOfByte, int paramInt2, long paramLong);

  // [...] // noch mehr native Methoden

  
  public static void load()
    throws Exception
  {
    System.out.println(ifaceLoaded);
    if (libLoaded == 1)
      throw exAlreadyLoaded;
    try
    {
      System.loadLibrary("jpicusb");
      libLoaded = 1;
    } catch (UnsatisfiedLinkError e) {
      throw exFileNotFound;
    } catch (SecurityException e) {
      throw exSecurity;
    }
  }
}
```


Und zu guter Letzt der JNLP Aufruf Code:
[XML]<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" href="launch.jnlp">
    <information>
        <title>USBWebStart</title>
        <vendor>Home</vendor>
    </information>
    <security>
        <all-permissions/>
    </security>
    <resources>
        <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>
        <jar href="USBWebStart.jar" main="true" />
        <nativelib href="jpicusb.jar" download="eager"/>
    </resources>
    <application-desc name="UsbConnect" main-class="UsbConnect"></application-desc>
     <update check="background"/>
</jnlp>[/XML]

Im Anhang habe ich auch noch die Projektbäume der .jar Dateien eingebunden. Vielleicht mache ich da ja was falsch mit der .DLL Datei.

Es würde mich wirklich freuen, wenn mir jemand weiterhelfen kann. Ich habe es wirklich ausgiebig versucht, aber jetzt weiß ich einfach nicht mehr weiter.

Viele Grüße
Matthias


----------



## MQue (2. Mrz 2010)

Das ist jetzt eher schwierig zu sagen, lass den javah nochmal drüberlaufen, der dir dann die Herader Datei noch mal erzeugt,
Ansonsten vielleicht die dll in den Klassenpfad geben mit 

```
-Djava.library.path=C:/java/lib/irgendeine.dll
```


----------



## Matthias123 (2. Mrz 2010)

Da ich mich mit Java nicht gut auskenne, habe ich alles mit Netbeans compiliert. Ich weiß jetzt also nicht, was ich mit Deiner Code Zeile anfangen soll 

Meinst Du mit Javah und Header Datei die .dll Datei? Die ist ja nicht von mir.
Aber daran kann es auch eigentlich nicht liegen, weil es als normale Java Applikation einwandfrei funktioniert. Mit der selben .dll Datei.


----------

