Verknüpfung von BlueJ (Java) und Membrain DLL

Sie sind sich nicht sicher, in welches Forum Ihre Frage oder Ihr Anliegen passt?
Möchten Sie ein neues Forum vorschlagen? Möchten Sie Kritik am Forum selbst üben?

Dann posten Sie bitte hier.
Post Reply
MartinL
Posts: 5
Joined: Tue 12. Nov 2019, 10:50

Verknüpfung von BlueJ (Java) und Membrain DLL

Post by MartinL »

Hallo,

ich beschäftige mich seit kurzem mit Reinforcement Learning und habe dem Computer zunächst beigebracht, TicTacToe zu spielen. Das habe ich ohne Neuronale Netze, sondern über eine Tabelle realisiert, in der nach und nach jeder Zustand verknüpft mit jeder Aktion bewertet wurde. Jetzt würde ich meinen Horizont gern erweitern und versuchen, diese Problemstellung mithilfe eines Neuronalen Netzes zu lösen.

Für die Entwicklung meiner Programme nutze ich die Java-Entwicklungsumgebung BlueJ und zwar als Standalone Version auf einem USB-Stick. BlueJ bringt also Java direkt mit und ich bin unabhängig von einer Java-Installation auf dem PC. Ich würde nun gern über die Wrapperklasse irgendwie eine Verbindung mit der DLL herstellen, leider bekomme ich beim Versuch, die Version auszulesen einen Fehler.

Code: Select all

java.lang.UnsatisfiedLinkError: MBDllWrapper.GetWrapperVersionInfo()Ljava/lang/String;


Ich bin bisher wie folgt vorgegangen, vielleicht habe ich ja nur etwas vergessen, oder an die falsche Stelle kopiert.
  • Ich habe die Datei MBDIIWrapper.java in mein Projektverzeichnis kopiert, diese Klasse eingebunden und übersetzt.
  • Ich habe die im Kommentar genannten Dateien MBDllWrapper64.dll und MemBrainDll64.dll in den Ordner bluej\jdk\bin eingefügt. Für mich scheint dieser Ort grundsätzlich passend, da in diesem Ordner lauter .dll Dateien liegen.
  • Ich habe dann eine Klasse geschrieben, in der zuerst ein Objekt "membrain" der Klasse MBDllwrapper erzeugt und die Methode membrain.GetWrapperVersionInfo() aufgerufen.
Das Anlegen des Objektes der Klasse MBDllWrapper funktioniert noch. Erst beim Versuch, die Versionsinformation zu bekommen, entsteht der oben genannte Fehler. Muss ich noch etwas irgendwo einfügen? Ansonsten könnte ich auch noch versuchen, herauszufinden, an welcher Stelle BlueJ wann nach welchen Dateien sucht, aber ich habe mir gedacht, ich frage lieber zuerst, vielleicht gibt es ja etwas einfacheres, was ich zuerst ausprobieren kann.

EDIT: Nur zur Ergänzung, ich bin ziemlich sicher, dass der Ordner richtig ist. Ich habe jetzt im Debugging noch einmal geschaut und beim Erzeugen des Wrapper-Objekts taucht folgendes auf:

Code: Select all

java.lang.ClassLoader$NativeLibrary.load
und als Instanzvariable wird unter anderem angegeben:

Code: Select all

String name = "F:\\BlueJ.....\\bluej\\jdk\\bin\\MBDllWrapper64.dll"
Also der sucht schon an der richtigen Stelle und findet ja scheinbar auch.

Viele Grüße
Martin
User avatar
TJetter
Posts: 346
Joined: Sat 13. Oct 2012, 12:04

Re: Verknüpfung von BlueJ (Java) und Membrain DLL

Post by TJetter »

Hallo Martin,

bist du sicher dass es sich auf dem Stick um eine 64 Bit Java Runtine handelt?
Bitte versuche einmal, in der MBDllWrapper.java die obere Zeile für 32 Bit Java einzukommentieren und die 64 Bit Version auszukommentieren:

Code: Select all

static
{
	System.loadLibrary("MBDllWrapper");
	// For 64 bit java engines use the following line instead:
	//System.loadLibrary("MBDllWrapper64");
}
Dementsprechend auch bitte die Dateien MBDllWrapper.dll und MemBrainDll.dll hinzukopieren.

PS: Die Methoden in der Klasse sind allesamt static. D.h., es braucht keine Instanz von MBDllWrapper erzeugt zu werden. Die Methoden können direkt über den Klassenscope aufgerufen werden, also z.B.:
// Print wrapper dll version info
System.out.println(MBDllWrapper.GetWrapperVersionInfo());

Es sollte allerdings genauso über eine Objektinstanz funktionieren, daran kann es also eigentlich nicht liegen. Bitte versuch das trotzdem einmal wenn die 32 Bit Variante auch nicht klappen sollte.

Ansonsten fällt mir höchstens noch ein, dass es unter BlueJ evtl. Probleme geben könnte, native Windows dlls aufzurufen. Damit kenne ich mich allerdings leider nicht näher aus.

Viele Grüße
Thomas Jetter
MartinL
Posts: 5
Joined: Tue 12. Nov 2019, 10:50

Re: Verknüpfung von BlueJ (Java) und Membrain DLL

Post by MartinL »

Vielen Dank schon einmal für die schnelle Antwort, leider handelt es sich wohl wirklich um eine 64 Bit Java Runtime. Ich erhalte zumindest folgenden Fehler, wenn ich es mit der 32-Bit-Version probiere.

Code: Select all

java.lang.UnsatisfiedLinkError: F:\BlueJ-windows-422-membrain\bluej\jdk\bin\MBDllWrapper.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
Das wiederrum ist allerdings ja ein weiteres Indiz dafür, dass der Dateipfad richtig ist und er zumindest etwas lädt. Ich werde mal recherchieren, ob ich allgemein etwas zu BlueJ und nativen Windows dlls finde und sonst auf eine andere Entwicklungsumgebung umschwenken. BlueJ nehme ich eigentlich nur, weil ich es mit meinen Schülern nutze und mich deshalb sehr daran gewöhnt habe.

Viele Grüße
Martin
MartinL
Posts: 5
Joined: Tue 12. Nov 2019, 10:50

Re: Verknüpfung von BlueJ (Java) und Membrain DLL

Post by MartinL »

Es funktioniert :D (und war ein BlueJ Fehler, der sich aber beheben lässt)

Ich habe es zuerst in einer anderen Umgebung versucht und da ist mir folgende Quelltextzeile aufgefallen:

Code: Select all

package de.membrainminusnn
Diese Zeile fehlt in meinem BlueJ Projekt. In dem Moment, in dem ich die Klasse als neue Klasse meinem BlueJ Projekt hinzufüge, merkt BlueJ scheinbar, dass es das Paket nicht gibt und entfernt diese Quelltextzeile automatisch. Dadurch kann ich Objektinstanzen zwar problemlos erzeugen, allerdings existiert das Paket halt nicht. Erst wenn ich das Paket manuell anlege und MBDllWrapper dort öffne, bleibt die Zeile erhalten. Dieses Paket kann ich dann normal importieren und dann erhalte ich folgende schöne Ausgabe:

Code: Select all

MemBrain JNI Wrapper Dll V09.00.00.00 (Sep 28 2019)
Viele Grüße
Martin
User avatar
TJetter
Posts: 346
Joined: Sat 13. Oct 2012, 12:04

Re: Verknüpfung von BlueJ (Java) und Membrain DLL

Post by TJetter »

Sehr gut :-)
Der nächste Schritt wäre dann die Version der eigentlichen MemBrain dll abzufragen:

Code: Select all

MBGetVersionInfo
Die Funktion

Code: Select all

GetWrapperVersionInfo
liefert lediglich die Version der Wrapper dll. Wenn dieser Zugriff klappt, dann werden auch die anderen Aufrufe funktionieren.
Achtung: Die aktuelle dll Version liefert die Version 09.00.00.09 zurück. Korrekt wäre 09.00.00.00. Bitte also nicht wundern. Das wird im Zuge der nächsten fälligen dll-Version korrigiert.
Thomas Jetter
MartinL
Posts: 5
Joined: Tue 12. Nov 2019, 10:50

Re: Verknüpfung von BlueJ (Java) und Membrain DLL

Post by MartinL »

Vielen Dank für die Info. Ja, auch das funktioniert. Ich habe testweise auch schon ein einfaches Netz in Membrain für das XOR Problem gebaut, trainiert und dann gespeichert. Die trainierte Version konnte ich in mein Programm einbinden, mit Eingaben versorgen und die Ausgaben abrufen. Die Verknüpfung klappt also.

Jetzt muss ich mich ein wenig einlesen und dann schaue ich mal, ob ich es hinbekomme, den Computer etwas lernen zu lassen. ;)

Gruß
Martin
Post Reply