Java Web Start - Native DLL einbinden

Matthias123

Grünschnabel
Hallo zusammen!

Ich habe hier ein USB-Gerät (Lampe).
Mit C# hatte ich mir mal ein Desktop-Programm dazu geschrieben, was dazu die mpusbapi.dll verwendet hat.

Nun möchte ich die Lampe gerne im Browser ansprechen, worauf ich auf Java gekommen bin.

Eine .dll habe ich auch für Java gefunden: jPicUSB. Die Seite ist leider auf spanisch, aber sehr zu empfehlen, wenn mal jemand Ähnliches vor hat.
Denn solange ich eine normale Java Applikation schreibe, funktioniert alles prima und ich kann meine Lampe ansprechen.

Da ich das ganze aber online bringen will, brauche ich ein Applet oder muss es mit Java Web Start machen.
Mit einem Applet bin ich gescheitert. Das hat immer nur an dem PC funktioniert, an der auch das Projekt compiliert wurde, obwohl ich mit einem "Install Applet" die .jar und .dll Datei in das jre/lib/ext Verzeichnis geschrieben habe.

Also bin ich jetzt auf Java Web Start umgestiegen und probiere es da. 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)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
#### Java Web Start Error:
#### null

So sieht meine Main Klasse aus:
Code:
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:
Code:
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 String pVID_PID = "vid_04d8&pid_000b";
  private static int instance = 0;
  private static int libLoaded = 0;

  public static int FUNCTION_CALL_FAIL = -1;

  public static int MPUSB_FAIL = 0;

  public static int MPUSB_SUCCESS = 1;

  public static int MP_WRITE = 0;

  public static int MP_READ = 1;

  public static int MAX_NUM_MPUSB_DEV = 127;

  public static native String GetAPIVersion();

  public static native int GetDeviceCount(String paramString);

  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);

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

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

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

  public static long QWrite(byte[] pData, int dwLen, long dwMilliseconds)
  {
    return Write(pVID_PID, instance, pData, dwLen, dwMilliseconds);
  }

  public static byte[] QRead(int dwLen, long dwMilliseconds)
  {
    return Read(pVID_PID, instance, dwLen, dwMilliseconds);
  }

  public static byte[] QWriteRead(byte[] pData, int dwLenWrite, int dwLenRead, long dwMilliseconds)
  {
    return WriteRead(pVID_PID, instance, pData, dwLenWrite, dwLenRead, dwMilliseconds);
  }

  public static void set_vidpid(String s)
  {
    pVID_PID = s;
  }

  public static void set_instance(int i)
  {
    instance = i;
  }

  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:
Code:
<?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>

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.
Falls der Thread in einem Unterforum besser aufgehoben wäre, muss ich mich schonmal entschuldigen, aber ich kenne mich mit Java und den Begriffen nicht aus und weiß nicht wo Web Start dazu gehört.

Viele Grüße
Matthias
 

Anhänge

  • projekt_baum.jpg
    projekt_baum.jpg
    9,8 KB · Aufrufe: 75
  • projekt_baum_DLL.jpg
    projekt_baum_DLL.jpg
    4,5 KB · Aufrufe: 66
Zurück