INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

LabVIEW und Java via JVM/JNI/Jace



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

15.04.2010, 18:16
Beitrag #1

Hep Offline
LVF-Grünschnabel
*


Beiträge: 20
Registriert seit: Oct 2007

2009
2008
DE

80339
Deutschland
LabVIEW und Java via JVM/JNI/Jace
Grüß Euch!

Seit einiger Zeit versuche ich, ein in Java geschriebenes Open Source Projekt mit LabVIEW anzusteuern. Genauer möchte ich bilder im OME-TIFF format via bio-formats (s. http://www.openmicroscopy.org/site) speichern. Vom OSProjekt aus gibt es auch die c++ bindings, sodass man die Funktionen via java virtual machine, mit Jace als dll bekommt.
Um von LabVIEW aus darauf komfortabel zugreifen zu können, versuche ich eine Wrapper-Dll zu schreiben, die mit der o.g. dll kommuniziert. Diese startet bis jetzt die JVM und schreibt ein Bild aus Zufallszahlen. Zum Test habe ich ein c++ konsolenprogramm geschrieben, das wie nachher LabVIEW die dll ansteuert. Damit funktioniert alles wunderbar.
Rufe ich meine wrapper dll aber mit LabVIEW auf, bekomme ich Probleme:
Starte ich nur die JVM, so endet die Funktion ohne Fehler und gibt mir auch zufällig gewählte Zahlen wie z.B. 42 zurück. Wenn ich dann aber LabVIEW schließe, bekomme ich den Fehler <The instruction at “0x08f2f83a” referenced memory at “0x081f9b64”. The memory could not be “read”>. Das passiert genau dann wenn jace::helper::createVM(..) nicht auskommentiert ist.
Die JVM scheint also irgendwie ziellose Pointer zu erstellen, die das c++ programm nicht stören, LV aber schon..

Wenn ich zusätzlich versuche, das Zufallsbild zu schreiben, bekomme ich bei der Ausführung Fehler - aber ich nehme an dass das an der falsch initialisierten JVM liegt..

Hat jemand von Euch erfahrung mit LabVIEW und JVM? Das näheste, das ich dazu gefunden habe, war der Artikel

http://digital.ni.com/public.nsf/allkb/BEE...6256BC80068A49A

der mir aber auch nicht weiterhelfen konnte..
für die JVM gibt es eine JVM.dll, die ich als includepfad beim erstellen der lvlib angegeben habe, da LabVIEW scheinbar nicht standardmäßig die PATH-Systemvariable durchsucht (!?)

viele Grüße + Danke
Heinrich

(verwendete Versionen: Visual Studio 2008, LV2009)
[der .cpp code ist grad nicht sehr schön weil ich grad dauernd am rumkommentieren zum fehlersuchen bin - main wird nicht verwendet, nur createJVM und minWrite]


Angehängte Datei(en)
Sonstige .zip  WriteOMETIFF.zip (Größe: 11,28 MB / Downloads: 330)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.04.2010, 06:29 (Dieser Beitrag wurde zuletzt bearbeitet: 16.04.2010 06:34 von rolfk.)
Beitrag #2

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
LabVIEW und Java via JVM/JNI/Jace
Wie sieht das LabVIEW Interface zu int minWrite(int argc, const char *argv[]) aus?

Dieser argv Parameter ist nichts was LabVIEW's Call Library Node direkt machen kann!!

Und stimmen die konfigurierten Calling Conventions in der Call Library Node mit denen des DLL Projekts überrein? Da Du die nicht explicit im C Source definierst werden die Projektsettings genommen, die wenn Du gar nichts angibst bei Visual Studio zumindest früher normalerweise cdecl war.

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
19.04.2010, 09:04
Beitrag #3

Hep Offline
LVF-Grünschnabel
*


Beiträge: 20
Registriert seit: Oct 2007

2009
2008
DE

80339
Deutschland
LabVIEW und Java via JVM/JNI/Jace
Ich habe den call library node verwendet und argv als c-string-zeiger definiert - dann war das wohl falsch? dann werde ich mal schauen wie ich das richtig mache (allerdings kommt der memory-fehler auch wenn ich minWrite nicht aufrufe)

Ich habe es eben auch so gelesen, dass die aufrufkonvention cdecl ist, und habe angenommen dass das der aufrufkonvention C im call library node entspricht, und dieses ausgewählt..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
19.04.2010, 09:56
Beitrag #4

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
LabVIEW und Java via JVM/JNI/Jace
' schrieb:Ich habe den call library node verwendet und argv als c-string-zeiger definiert - dann war das wohl falsch? dann werde ich mal schauen wie ich das richtig mache (allerdings kommt der memory-fehler auch wenn ich minWrite nicht aufrufe)

Ich habe es eben auch so gelesen, dass die aufrufkonvention cdecl ist, und habe angenommen dass das der aufrufkonvention C im call library node entspricht, und dieses ausgewählt..

const char * argv[] ist nicht ein C String pointer sondern ein Pointer auf ein Array von C String Pointern. (Könnte auch ein Pointer auf einen C string Pointer sein, da C keinen Unterschied macht zwischen char *var und char var[], respektive die zweite Variante war in vielen früheren C Compilern unbekannt) aber argc und argv sind die üblichen Weisen um Aufrufparameter an die Hauptfunktion eines Executables zu übergeben und dort ist es immer ein Array von Strings.

Da aber LabVIEW Strings nicht gleich C Strings sind kann man nicht einfach ein LabVIEW Stringarray machen und das an die Funktion geben und der const char *argv[] ist ganz sicher kein C String Pointer, d.h. deine Funktion is mit der Call Library Node grundsätzlich nicht aufrufbar.

Wenn der Memoryfehler auch beim Aufrufen von nur der createJVM() geschieht hast Du ein seriöses Problem. Die Funktionsparameter sind ja eindeutig, da kann es also beinahe nicht liegen. Deshalb muss es wohl etwas sein was Du in dieser Funktion tust. Was kann ich Dir leider nicht sagen da ich erstens nicht gut beschlagen bin in C++ und zweitens die Library die Du aufrufst nicht kenne. Von meinen C Kenntnissen her finde ich einiges an dem Code sehr fragwürdig aber kann nicht beurteilen ob es ein Problem ist. Beispielsweise deklarierst Du eine Variable jace::OptionList list; und referenzierst Du die danach. Es ist mir nicht deutlich ob die Deklaration dieser Variablen diese auch gleich initilialisiert oder nicht. Falls nicht müsste der anschliessende Aufruf natürlich schwer in die Hosen gehen.

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
08.09.2010, 09:09
Beitrag #5

Hep Offline
LVF-Grünschnabel
*


Beiträge: 20
Registriert seit: Oct 2007

2009
2008
DE

80339
Deutschland
LabVIEW und Java via JVM/JNI/Jace
Der Vollständigkeit halber: ich habe es nur hinbekommen, von einem c++ program meine wrapper dll aufzurufen und die Funktionalität der java library zu bekommen. Sobald ich mit einem labview programm die selbe dll aufrufe, funktioniert es nicht. und das auch ohne Argumente in den aufrufenden Funktionen.

Also war der erste Versuch die Funktionalität in einder eigenen dll nachzuschreiben und diese von labview aufzurufen. das funktioniert, ist halt mühsame arbeit und wenig elegant.

Dann hat sich eine zweite Variante ergeben: es gibt in Labview (zumindest ab 2009) den Matlab script knoten. Damit kann man auch m-files aufrufen, die man schön übersichtlich programmieren kann. in einem solchen habe ich die java library aufgerufen und bekomme auch in LabView zugriff auf die komplette Funktionalität.
Ein Problem hierbei ist nur, dass der Knoten alle numerischen Werte in Double konvertiert, d.h. wenn man z.B: u16 daten hat, müssen die immer hin-und her konvertiert werden.

viele Grüße
Heinrich
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Java JAR-Bibliothek in Labview nutzen A_Bachmann 2 7.378 16.05.2014 14:28
Letzter Beitrag: A_Bachmann

Gehe zu: