AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi mit Java komunizieren

Offene Frage von "bucchi"
Ein Thema von Simon1988 · begonnen am 12. Jul 2006 · letzter Beitrag vom 27. Okt 2006
Antwort Antwort
Seite 3 von 8     123 45     Letzte »    
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#21

Re: Delphi mit Java komunizieren

  Alt 29. Jul 2006, 11:33
Hi,
ich glaube ich muss nochmal etwas korrigieren, was ich einst (lang lang ist's her) sagte. Dein Fehler liegt wahrscheinlich immer noch an der JVM.dll. Ich sagte damals etwas dumm, dass du auch nur die .dll kopieren kannst. Das stimmt so natürlich null!
Das Problem ist, dass weitere Files benötigt werden, deren Pfad relativ zur .dll ist. An sich wäre es eh eine unschöne Lösung eine Datei in jeden Ornder zu kopieren, der diese benötigt (würde ihren Sinn stark in Frage stellen!). Ich hätte einfach deutlicher sagen sollen, dass es eigentlich keine ernsthafte Alternative ist (schätze du hast die Lösung gewählt).
Es gibt aber weiterhin zwei Möglichkeiten, die die schon im alten Beitrag nannte gilt immer noch. Du musst einfach den Suchpfad unter Windows so setzen, dass die dll mit in diesem liegt. Das Problem ist allerdings, dass du damit natürlcih auf jedem Rechner auf dem dein Programm läuft den Pfad der jvm.dll ermitteln und in die PATH Variable aufnehmen musst. Gerade bei W2k und XP (und Nachfolger) heißt dass, das du dich wohl einmal als Admin anmelden musst, nicht sehr praktisch.
Schöner ist es, wenn man die Dll einfach dynamisch lädt. Immerhin sind das dynamische Bibliotheken, ihr Sinn liegt also gerade darin. Dynamisch heißt hier einfach, dass du nicht statisch gegen eine dll linkst sondern die dll erst zur Laufzeit bekannt ist. Dann wird in dieser dll die Adresse des Einsprungpunktes (einer Funktion) gesucht und diese dann ausgeführt.
Der Vorteil liegt klar auf der Hand, du kannst eine .exe direkt starten und musst dich nicht kümmern, wo die jvm.dll liegt. Genau gesagt kümmert sich dein Programm darum, also einmal (beim Programmieren) mussst du dich drum kümmern, aber eben nicht mehr bei der Ausführung.
Bleibt also nur das Problem, wie du den Pfad der JVM.dll findest und wie deine TJavaVM von diesem Pfad erfährt. Letzteres (hab mir jetzt auch mal JavaD etwas näher angeschaut) ist gar kein Problem. Es gibt einen überladenen Konstruktor der TJavaVM. Diesem kannst du auch den Pfad zur JVM.dll übergeben.
Wo also findet man diese Datei? Festplatte durchsuchen könnte ein Weilchen dauern und wäre kaum sinnvoll. Standardpfade sind etwas worauf man sich nie verlassen sollte (schon Programme die einen Ordner 'Program Files' anlegen nerven doch). Aber Suns JRE trägt sich ganz vorbildlich in die Registry ein. Hab mal geguckt, auf meinem Rechner stimmen Suns Angaben natürlich völlig mit der Position der Schlüssel überein.
Deshalb häng ich dir jetzt auch mal einen kleine Wrapper an. Der erzeugt dir die TJavaVM und TJniEnv und sucht dabei automatisch den Pfad zur JVM.dll. Du kannst einfach eine neue Instanz mit TJvm.Create(<ClassPath>) erzeugen. In dem Pfad klappt dann auch ein '.' oder ähnliches. Schöner ist natürlich, wenn du für Java-Klassen einen eigenen Ordner anlegst.
Mit dem Aufruf des Konstruktors wird jedenfalls eine TJavaVM angelegt (also die JVM.dll geladen). Treten keine Fehler auf, so hat alles geklappt (es gibt keine andere Rückmeldung).
Ja, vielleicht hilft es dir erstmal weiter. Da mich das Thema auch gerade interessiert werde ich es mir mal noch näher angucken. Hatte bisher immer den umgekehrten Weg behandelt, dass ein Java-Programm nativen Code ausführen muss. Da sieht vieles natürlich ähnlich aus (immerhin läuft alles über die gleiche Schnittstelle), aber natürlich muss man sich da nicht um das Laden der JVM sondern um das laden der Biblitheken in Java kümmern (was recht einfach ist!).
Also wenn ich jetzt so weiter mache, wie im angegebenen Beispiel bekomme ich noch Fehlermeldungen (bei Aufruf einer Methode), aber mal schauen, denke ich mach da nur noch was falsch.
Angehängte Dateien
Dateityp: pas ujvm_680.pas (6,0 KB, 36x aufgerufen)
  Mit Zitat antworten Zitat
Simon1988

Registriert seit: 12. Jul 2006
39 Beiträge
 
#22

Re: Delphi mit Java komunizieren

  Alt 29. Jul 2006, 12:54
das heißt wenn ich diese Unit einbeziehen und einfach den Befehl
TJvm.Create(<ClassPath>)
aufrufe, erzeugt er mir gleich die JVM instanz ? .. also fürht sozusagen automatisch den befehl JavaVM := TJavaVM.Create; aus ?!
erzeugt der befehl TJvm.Create(<ClassPath>) auch gleich ein Objekt der Klasse TJNIEnv ?

Nochmal Vielen Dank. Hier bekommt man echt gute Hilfe . bin begeistert
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#23

Re: Delphi mit Java komunizieren

  Alt 29. Jul 2006, 13:46
So,
hab mal ein kleines Beispielprojekt zusammengestellt. Ist sehr sehr einfach gehalten, sollte dir aber grob klar machen wie du dein Programm (das etwas mehr beihalten sollte als die Klasse hier) zum laufen bekommst. Der Java-Src liegt dann natürlich auch bei. Die Java Sachen liegen im Unterordner Java, der Delphicode direkt im Ordner. Du brauchst dir eigentlich nur das Formular anschauen, die andere .pas hast du schon.
Das komplette Anlegen der JVM und TJNIEnv passiert im onCreate des Fomulars (ist nur der Aufruf von TJvm.Create (mit dem ClassPath), was deine Frage beantworten dürfte, ja legt Beides an.

Dann hast du ein Formular mit vier Buttons. Die machen eigentlich genau das was drauf steht. Einmal wird eine statische Variable gelesen, einmal eine nicht statsiche, einmal eine statische Methode ausgeführt, einmal eine nicht-statische.
Das ist alles.
Hatte gerade ein paar Probleme mit dem korrekten Erzeugen einer neuen Instanz (übersehen, dass ich die Method-Id des Standardkonstruktors mit übergeben muss). Da ist halt wenn du andersrum arbeitest das schöne, dass du natürlich schon eine Instanz (als this Zeiger) hast.
Ok, der Code mag im ersten Moment etwas kompliziert wirken (gerade was die Signaturen von Methoden angeht), ist aber super einfach. Muss hier auch sagen, die Kapselung von diesem JavaD ist super! Ist wirklich einfach wenn man berücksichtigt, dass hier eigentlich vollkommen verschiedene Systeme aufeinander treffen (auch ein Lob an das imho durchdachte JNI!)
Hab ordentlich viele Kommentare geschrieben, hoffe die helfen dir weiter. Ja, wie gesagt damit solltest du eigentlich was zum Laufen bekommen.

Viel Spaß + Erfolg!
Angehängte Dateien
Dateityp: zip javagoesdelphi_190.zip (262,9 KB, 42x aufgerufen)
  Mit Zitat antworten Zitat
Simon1988

Registriert seit: 12. Jul 2006
39 Beiträge
 
#24

Re: Delphi mit Java komunizieren

  Alt 30. Jul 2006, 10:19
hey. das TextProgramm ist gut. und behebt eig alle Fragen

also wie ich das sehe gibts Felder ?!!!
und Methoden. Methoden sind wahrscheinlich eine Art proceduren?!!
aber was sind Felder bzw. Field ^^.

und dann ist das ganze einmal in statisch und nicht statisch geteilt. Bei dem einen wird eine Instanz erzeugt bei dem anderen nicht. was hat es damit aufsich ?!

reichen mir diese 4 Teile um so auch komplexere JavaProgramme zu steuern. Oder gibt es noch weit aus mehr Befehle ?
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#25

Re: Delphi mit Java komunizieren

  Alt 31. Jul 2006, 09:15
Felder und Methoden, ja, dass sind einfach nur Bezeichnungen in der OOP. Ein Feld entspricht eigentlich einer normalen Variablen in einer Klasse, Methoden sind wiederum entweder Prozeduren oder Funktionen in einer Klasse. Das ist es grob gesagt auch schon.
Das Beispiel mit den Feldern solltest du eigentlich in sauberen Code so gut wie nie brauchen. Zwar unterstützt Java keine Properties, aber natürlich gibt es auch hier getter und setter (und bei Beans entspricht das den Properties).
Jedenfalls gilt für guten Java Code, dass eigentlich alle Variablen private sind und du über Methoden auf diese zugreifst. Damit kann man schon eine unterschiedliche Sichtbarkeit (für's Schreiben und Lesen) ermöglichen (hat natürlich noch andere Vorteile).
Andererseits kennt Java auch keine direkten Konstanten bzw. man hat kein const Präfix sondern setzt eine Variable static final (entspricht dem Konstanten).

Ja, damit wären wir auch schon bei static. Statische Variablen und Methoden haben eine Besonderheit, sie werden an einer festen Adresse angelegt. Egal wer auf eine solche Methode/Variable zugreift, es handelt sich immer um die selbe!
Code:
class TestClass {

  static int staticFoo = 0;

  int foo = 0;

}

class Test {

  public static void main(String[] args) {
    TestClass tc1 = new TestClass();
    TestClass tc2 = new TestClass();

    tc1.foo++; // tc1.foo = 1, tc2.foo = 0
    tc1.foo++; // tc1.foo = 2, tc2.foo = 0

    tc1.staticFoo++; // tc1.staticFoo = 1, tc2.staticFoo = 1
    tc2.staticFoo++; // tc1.staticFoo = 2, tc2.staticFoo = 2
   
    TestClass.staticFoo++; // tc1.staticFoo = 3, tc2.staticFoo = 3
  }
}
Das wäre sehr einfaches Beispiel für static vs. non-static. Wichtig ist, dass du die nicht als sauberes Beispiel auffässt! Da sind einige Sachen nicht schön!
Bei statischen Variablen bzw. Methoden handelt es sich um Dinge, die für diese Klasse einzigartig sind. Legst du mit new eine neue Instanz einer Klasse an (oder nimm Create in Delphi), dann wird für diese neue Instanz eigener Speicher reserviert. Das ist auch in den meisten Fällen gewollt. Als gutes Beispiel bietet sich hier ein Bank an, es möchte sicherlich jeder Kunde auf sein Konto zugreifen und nicht alle auf eins (da würden die Staatsschulden wohl das Gemeinschaftskonto etwas tiefrot aussehen lassen). Das heißt, jede Variable (z.B. der Kontostand) wird einzeln für ein bestimmtes Objekt geändert und gespeichert. Wie gesagt, dass ist das was du normalerweise in Programmen hast.
Deswegen benötigt man auch einen neue Instanz, hat man keine neue Instanz erzeugt, wurde noch gar kein Speicher reserviert, wo also sollen die Daten hin? Legt man keine Instanz an, erwartet einen unter Java die NullPointerException (EAccessViolation unter Delphi).
Jetzt gibt es aber Dinge, die möchte man statisch haben. Statisch heißt, dass der Speicher automatisch beim Laden der Klasse angelegt wird und für diese Klasse eine feste Position hat. Es gibt auch hier zwei einfache Beispiele:
1) Die public static void main(String[] args), eine statische Methode.
Warum ist die statisch? Nun ja, wenn du das Programm startest, kannst du ja noch keine Instanz von irgendwas erzeugt haben, da bietet sich also ein statischer Einsprungpunkt an.
2) Konstanten. Diese haben die Form final static <DatenTyp> <Name> = <Wert>
Wenn ich eine Konstante habe, dann sollte sie für alle Instanzen gleich sein. Greifen wir nochmal das Beispiel des Kontos auf und sagen wir, dass ein Kontotyp als Zahl gespeichert wird. Dann steht die 1 immer für ein Girokonto und die 2 immer für ein Sparbuch, egal wessen Konto ich gerade betrachte.
Der final Teil in der Konstante sorgt dafür, dass diese auch an einer festen Adresse im Speicher steht und nicht verändert werden kann (bringt auch einige Vorteile bei Zugriff auf diese Variable).

Wichtig ist, dass man trotzdem statische Variablen/Methoden vermeidet. Man sollte sich immer überlegen, ob sie nötig sind. Es gibt wie gesagt Gründe für den Einsatz, aber man möchte ja auch nicht unnötig Speicher reserviert halten. Vorallem kann es auch zu Problemen kommen, wenn man nicht merkt dass eine Variable statisch ist (s.Bsp. Konto), würde hier versehentlich alles auf ein Konto geschrieben werden...

Für statische Methoden/Variablen gilt auch, dass der Aufruf immer direkt mit dem vorangestellten Klassennamen erfolgt. Hier erkennt man dann schnell, ob es sich um eine statische oder nicht statische Variable handelt. Nochmal am Bsp. von oben:
Code:
class TestClass {

  static int staticFoo = 0;

  int foo = 0;

}

class Test {

  public static void main(String[] args) {
    // RICHTIG:
    // Vorangestellter Klassenname macht deutlich dass es um eine statische Variable geht
    TestClass.staticFoo++;
   
    // FALSCH:
    // sollte zwar klappen, führt aber zu einem Warning!
    // ausserdem kann keiner erkennen dass diese Variable statisch ist!
    TestClass tc1 = new TestClass();
    tc1.staticFoo++;

    // AUCH FALSCH:
    // foo ist eine Instanz Variable, solch ein Aufruf ist also nicht möglich!
    TestClass.foo++;  
  }
}
Ja, was das Programm angeht, so denke ich solltest du damit eigentlich auf jedes (auch komplexe) Java Programm zugreifen können. Wie du siehst gibt es immer die Unterscheidung zwischen statisch und nicht statisch (die ich dir hoffentlich näher bringen konnte). Der Rest ist ja eigentlich nur dass Aufrufen einer Methode oder das Lesen einer Variable, aus mehr bestehen Programme ja eigentlich wieder nicht.
In meinem Beispiel ist es allerdings auf primitive Datentypen beschränkt. Natürlich kannst du auch Intanzen als Rückgabetyp bekommen. Wie man mit denen weiterarbeitet, findest du dann wiederum auf den JNI Seiten. Dort werden auch alle verwendeten Funktionen (ausser dem anlegen der JVM und JNIEnv in Delphi) erklärt. Beispielcode ist dort zwar in C, aber die Erklärungen sind auch immer ohne Code verständlich (soviel gibt es dort imho auch gar nicht). Eine Sache die noch ganz wichtig ist, Java-Strings sind Klassen! Wenn du einen String an Java übergeben willst bzw. umgekehrt, wirst du von der JNIEnv die Methoden JavaStringToString und StringToJavaString verwenden müssen (glaube die hießen so).
Ja, wie gesagt, die Basis für das Arbeiten mit Java-Programmen solltest du haben, aber ein wenig musst du dann auch noch selbst machen Ausser du zahlst gut!
  Mit Zitat antworten Zitat
Simon1988

Registriert seit: 12. Jul 2006
39 Beiträge
 
#26

Re: Delphi mit Java komunizieren

  Alt 2. Aug 2006, 13:18
Hey,
also nach deinem Genialen Textprogramm und deiner Hilfe mit statisch und nich statisch wurd mir jetzt einiges klar .. unter anderem auch, wie das tutorial aufgebaut ist und welche funktionen es gibt, wie sie aufgebaut sind ec.t
Danke nochmal


Eine frage hab ich aber dann doch noch. Ich soll ja am ende ein programm mit delphi steuern.
In diesem Programm gibt es eine Klasse, die nennt sich renderszene oder so. dem objekt diese klasse kann man durch methoden daten zuweisen, wie er was rendert und mit der methode render malt er mir dann was auf diese Oberfläche. (Oberfläche ist die klasse) .. also so ungefähr .
Ise es möglich diese Oberfläche auf mein Form1 zu bekommen ?!

Brauchste noch irgendwelche Informationen zur Klasse ?!

Wenn dass vllt. nicht geht wäre die alternative das GANZE programm im delphi fenster anzeigen zu können ?!
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#27

Re: Delphi mit Java komunizieren

  Alt 3. Aug 2006, 08:03
Zitat von Simon1988:
In diesem Programm gibt es eine Klasse, die nennt sich renderszene oder so. dem objekt diese klasse kann man durch methoden daten zuweisen, wie er was rendert und mit der methode render malt er mir dann was auf diese Oberfläche. (Oberfläche ist die klasse) .. also so ungefähr .
Ise es möglich diese Oberfläche auf mein Form1 zu bekommen ?!

Brauchste noch irgendwelche Informationen zur Klasse ?!
Nun ja, ich meine du sagst hier echt recht wenig über die Klasse, etwas mehr wäre schon schön. An sich ist mir hier aber keine komplett fertige Lösung bekannt. Wichtig ist hier erstmal, wie gerendert wird. Wenn es sich um Java 3D handelt, könnte es etwas problematischer werden. Hast du nur eine einfache Graphik, so kann man diese "leicht" als Bitmap weiterreichen.
Am besten ist halt so viel Information wie möglich (wo ich natürlich nicht weiß, wieviel du davon rausgeben darfst/möchtest/kannst). An sich ist natürlich hauptsächlich die Methode die zeichnet wichtig. Sie wird ja irgendwelche Daten irgendwie darstellen. Wichtig sind hier natürlich nicht die Daten oder wo sie herkommen, sondern wo wird gezeichnet. Wenn du also die Zeichenmethode hast, dann wäre es auch wichtig zu wissen was für eine Klasse als Ziel für's zeichnen übergeben wird. Ist es eine eigene Klasse wäre halt der entsprechende Vorfahrtyp interessant.
Ob und wenn ja wie man ein komplettes Java-Fenster in ein Delphi Programm einbettet ist mir komplett unbekannt (denke mal nicht dass das so ohne weiteres geht, sind einfach unterschiedliche Ansätze).
Ich denke mal, dass es auf eine Art Adapter hinaus laufen dürfte. Also ich denke du musst auf jeden Fall das Java-Programm erweitern. Hier kannst du evtl. dafür sorgen, dass ein Format erstellt wird, dass Delphi auch versteht (z.B. eine Bitmap) oder du müsstest halt die Render-Methode nach Delphi übersetzen, so dass du einfach die Daten oder Zeichenbefehle an Delphi weiterreichst.
Wenn es einen schöneren Weg gibt, ist er mir leider nicht bekannt. Wie gesagt, der Aufwand und Ähnliches hängt stark von deiner Klasse ab.
  Mit Zitat antworten Zitat
Simon1988

Registriert seit: 12. Jul 2006
39 Beiträge
 
#28

Re: Delphi mit Java komunizieren

  Alt 8. Aug 2006, 15:28
Hallo, ich war die letzte Woche leider im Urlaub. Ich versuche in den nächsten Tagen mehr über die Klasse und über den Rendervorgang zu erfahren ..

Simon
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#29

Re: Delphi mit Java komunizieren

  Alt 8. Aug 2006, 15:48
Hi,
dann hoffe ich doch mal, dass du einen schönen (und erholsamen) Urlaub hattest!

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Simon1988

Registriert seit: 12. Jul 2006
39 Beiträge
 
#30

Re: Delphi mit Java komunizieren

  Alt 8. Aug 2006, 19:12
Hey,
also bevor wir das mit dem rendern klären hab ich doch nochn paar fragen.
Bin jetzt fast ganz mit allen befehlen durchgestiegen. Ich bin grad dabei eine Bibliohek an Befehlen zu erstellen. Will am ende auchn Tutorial dazu ins Netz stellen. Wenns geht auf diese Seite.

1.
Also Je nachdem welchen Rückgabetyp ich habe benutze ich folgende Befehle
CallObjectMethode
CallIntMethode
CallByteMethode
usw.
Dabei kann ich arrays übergeben und alles. Das is mit klar wie das geht. Was ist aber wenn ich einen array zurückbekomme ?
also nicht nur einen einfachen Integertyp oder nen einfachen ByteTyp, sondern arrays.

2.
Dann bin ich noch auf folgende Befehle gestoßen. Vielleicht ist das auch schon die Antwort zu meiner 1. frage. Es gibt für alle CallBlablubMethoden auch noch folgende Methoden
CallObjectMethodeA
CallIntMethodeA
was bedeutet das A ? ebenso gibt es diese Funktionen auch noch mit einem V?

3.
was bedeutet der Befehl ReleaseShortArrayElements .. also speziell das Release ^^

Diese 3 Sachen sind mir noch nicht so geheuer. ich brauch die um meine Bibliothek zu ende zu bringen

Danke
Simon
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 8     123 45     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz