![]() |
Re: Delphi mit Java komunizieren
Hallo Miteinander, Ciao der Unwissende
Hab in der letzten Zeit wieder ein bisschen rumexperimentiert.... Jedoch stehe ich schon wieder etwas an... Habe folgender Code in Java geschrieben:
Delphi-Quellcode:
Das ganze wurde in einem .jar verpackt (2 Klassen "HelloWorld" und "HelloWorld2")
package test.d2j;
import test.d2j2.HelloWorld2; public class HelloWorld { public String Test(String name){ return "Ciao " + name; } public String Test2(String name){ HelloWorld2 hw2 = new HelloWorld2(); return hw2.Test(name); } } Soweit so gut. Keine Probleme mit mehreren Klassen in einem .jar beim Aufruf von Test2 via Delphi. Jetzt wollte ich aber zusätzlich das log4j einbinden. Das würde folgendermasse aussehen:
Delphi-Quellcode:
Und hier hänge ich wieder...
package test.helsana;
import org.apache.log4j.Logger; import test.helsana2.HelloWorld2; public class HelloWorld { private static Logger logger = Logger.getLogger( HelloWorld.class ); public String Test(String name){ return "Ciao " + name; } public String Test2(String name){ HelloWorld2 hw2 = new HelloWorld2(); return hw2.Test(name); } } Sobald ich den Logger einschalten will, findet er die Klasse nicht. Kann mir jemand weiterhelfen? Greez Bucchi |
Re: Delphi mit Java komunizieren
hey .. sorry .. muss auch noch nefrage stellen.
bei der ermittlung der MethodenID muss man ja die Übergabetypen festlegen. I steht für Integer usw.... was ist aber bei einer Objektübergabe. Reicht da folgende Zeile ? Lfully-qualified-class; oder hab ioch das falsch verstanden uns es muss folgendermaßen heißenm L<Classenname> ; oder wie soll das gehen ? |
Re: Delphi mit Java komunizieren
Achja noch ein weiteres Problem. Ich hab hier maln quelltext Form1.MiniSC.MBMap.obj ist hierbei das objekt der Klasse MBMap , dass ich schon erzeugt habe ..
Delphi-Quellcode:
Wenn ich haber die funktion newObject aufruf kommt ein fehler .. und zwar folgender :
cls := jvm.JniEnv.FindClass('com/gdv/mapbuilder/gui/MBMenuBar');
if cls = nil then ShowMessage('Klasse "MBMenuBar" nicht gefunden'); ConstructorMid := jvm.JniEnv.GetMethodID(cls, '<init>', '(Lcom/gdv/mapbuilder/MBMap;)V'); if ConstructorMid = nil then ShowMessage('Konstruktor nicht gefunden'); Obj := jvm.JniEnv.NewObject(cls, ConstructorMid, [Form1.MiniSC.MBMap.Obj]); if Obj = nil then ShowMessage('Fehler beim erzeugen der Instanz'); "im Projekt SC.ece ist eine Exception der Klasse EAccressViolation mit der Meldung"zugriffsverletzung bei Adresse 0047ßb74 in Modul "SC.exe". Lesen von adresse 00000004" aufgetreten" Die ShowMessage (Fehler beim erzeugen der Instanz kommt) nicht. hatter die instanz jetzt richtig erzeugt ?! .. ist meine übergabe [Form1.MiniSC.MBMap.Obj]); überhaupt richtig ?! .. oder übergeb ich da was anderes als das Objekt (Der klasse JObject) Gruß Simon |
Re: Delphi mit Java komunizieren
Zitat:
Zitat:
Liegt denn das jar File zu log4j im Klassenpfad? Nur da kann dann eine solche Klasse gefunden werden. Gruß Der Unwissende |
Re: Delphi mit Java komunizieren
Zitat:
Zitat:
Gruß Der Unwissende PS.: Wegen der Dauer der Antwort gilt das gleiche wie im Beitrag zuvor |
Re: Delphi mit Java komunizieren
Zitat:
Delphi Klassen und Java Klassen haben aus sicht des Programms nichts mit einander gemeinsam! Eine Delphi Klasse wird völlig anders initialisiert und auch völlig anders im Speicher gehalten. Den großen unterschied siehst du schon daran, dass du bei Java Reflections anwenden kannst, für Delphi ist nichts (komplett) gleichwertiges vorhanden. Das heißt, dass die JVM also schon andere Informationen als ein RTTI haben muss. Würdest du jetzt ein Delphi-Objekt als Instanz einer Java-Klasse weiter reichen, dann verstehe ich, dass es kracht! Die JVM würde nun eine Referenz auf ein Objekt bekommen. Um die korrekte Übergabe des Speichers kümmert sich dann schon die Kapselung (JNI), aber der Versuch diese Referenz als Java Klasse zu verwenden muss fehlschlagen. Die Frage wäre also, wie hast du Form1.MiniSC.MBMap.obj erzeugt? Gruß Der Unwissende |
Re: Delphi mit Java komunizieren
hey, also Form1.MiniSC.MBMap.Obj ist hierbei ein JObjekt und wurde folgender maßen erzeugt :
Delphi-Quellcode:
soweit ich das gesehen habe ist es auch kein fehler aufgetreten .. MBMap wurde erzeug.
cls := jvm.JniEnv.FindClass('com/gdv/mapbuilder/MBMap');
if cls = nil then ShowMessage('Klasse "MBMap" nicht gefunden'); ConstructorMid := jvm.JniEnv.GetMethodID(cls, '<init>', '()V'); if ConstructorMid = nil then ShowMessage('Konstruktor nicht gefunden'); Obj := jvm.JniEnv.NewObject(cls, ConstructorMid, []); if Obj = nil then ShowMessage('Fehler beim erzeugen der Instanz'); Die MBMenuBar (abstammung von der MenuBar in Java) wird nun erzeugt .. dafür muss ich diese MBMap übergeben
Delphi-Quellcode:
und bei der übergabe oder was auch immer kommt der fehler .. es könnte aber auch sein, dass der fehler nicht an der MBMap liegt , sondern ich einfach keine MenuBar ereugen kann, weil mir ein komponent fehlt .. oder weil ich keine Grafiken erzeugen kann ?! MBMenuBar = Menüleiste
cls := jvm.JniEnv.FindClass('com/gdv/mapbuilder/gui/MBMenuBar');
if cls = nil then ShowMessage('Klasse "MBMenuBar" nicht gefunden'); ConstructorMid := jvm.JniEnv.GetMethodID(cls, '<init>', '(Lcom/gdv/mapbuilder/MBMap;)V'); if ConstructorMid = nil then ShowMessage('Konstruktor nicht gefunden'); Obj := jvm.JniEnv.NewObject(cls, ConstructorMid, [Form1.MiniSC.MBMap.Obj]); if Obj = nil then ShowMessage('Fehler beim erzeugen der Instanz'); |
Re: Delphi mit Java komunizieren
Hi,
Zitat:
An sich sieht es sonst richtig aus. Hab es auch noch mal mit zwei sehr einfachen Klassen getestet (aber das einfach ist egal, entweder es klappt oder eben nicht), keine Probleme. Man kann ein JObject übergeben und es wird (wenn es vom richtigen Typ ist) auch gecastet und funktioniert. Deshalb solltest du wirklich nochmal schauen, was du für einen Parameter du wirklich übergibst. Am besten initialisierst du einfach mal Form1.MiniSC.MBMap.Obj mit nil und schaust halt vor dem Aufruf des Konstruktors der MBMenuBar nach, ob die Variable wirklich <> nil ist. Gruß Der Unwissende |
Re: Delphi mit Java komunizieren
Ich hab noch ein Problem.
Ich habe eine Klasse VectorDataSource. und eine Weiter Klasse namens ShapeVectorDataSource. Diese Klasse erbt von der VectorDataSource. Jetzt habe ich ein Object der KLasse ShapeVectorDataSource erzeugt. und eine andere Constructor verlangt aber kein ShapeVectorDataSource sonder die Klasse VectorDataSource (sozusagen die unterklasse) . meine frage ist nunr .. kann ich dieeinfach übergeben ?! also bei mir kommt ein fehler .. kann ich mit der jni das Objekt der Klasse ShapeVectorDataSOurce zum VectorDataSource casten (im Java geht das ja) |
Re: Delphi mit Java komunizieren
Hi,
das sollte eigentlich kein Problem darstellen. An sich weiß Delphi und JNI ja nichts von der Klasse die du verwendest. Es handelt sich um ganz normale Java Klassen, auf die du nur in der nicht JVM-Welt eine Referenz (JObject) hälst. Die Instanz hinter der Referenz kann aber ausserhalb der JVM nie verwendet werden. Deshalb kannst du über JNI auch das machen, was Java unterstützt. Eine Unterklasse ist ja nur eine Spezialisierung. Du garantierst damit, dass jede Unterklasse den Umfang der Elternklasse besitzt, diesen jedoch auch erweitern kann (und natürlich einzelne Methoden unabhängig implementieren). Nur damit ich es richtig verstehe, du hast etwas wie:
Code:
Das heißt, du erbst von VectorDataSource und irgendein konstruktor hätte gerne eine Instanz von VectorDataSource. Dem kannst du ohne Probleme (auch per JNI) eine Instanz von ShapeVectorDataSource übergeben. Nur das umgekehrte würde nie klappen, da ein ShapeVectorDataSource ja neue Dinge einführen kann.
public class ShapeVectorDataSource extends VectorDataSource { ...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz