![]() |
Re: Delphi mit Java komunizieren
hm .. komisch ..
also bei mir sagt der am schluss das das objekt das is erzeugen wollte leer ist. Woran kann es dann liegen ? Wenn nich daran ?! |
Re: Delphi mit Java komunizieren
Was?
Wer sagt dir denn was genau? Ich kenne deinen Code nicht, ich kann es dir mit so wenig Info's nicht sagen. Kann im Prinzip alles sein. Wenn JNI/Delphi nicht sagt, dass die Erzeugung fehlgeschlagen ist, dann hast du ein Objekt erzeugt und die Referenz kannst du in einem JObject speichern. Solange du diese Referenz nicht anfässt, wird die JVM wissen, dass die GC das zugehörige Objekt nicht freigeben darf. Würdest du hier etwas falsches Erzeugt haben, so bekommst du einen Error, der dir einen ungültigen Cast anzeigen würde. |
Re: Delphi mit Java komunizieren
so hier nochmal mit Quelltext :
als erstes wird ein Objekt der JavaKlasse ShapeVectorDatasource erzeugt .. dann will ich einen VectorLayer erzeugen. Der Konstuktor (wie man ja auch sieht) brauch aber nicht einen ShapeVectorblablub, sonder einen VectorDataSource (eben die unterklasse) .. und da kommt dass das objekt von der Klasse VectorLayer leer ist .. warum auch immer ..
Delphi-Quellcode:
es kommt keine Meldung außer 'Fehler beim erzeugen der Instanz: VectorLayer'
constructor JDShapeFileVector.create(Path :PAnsiChar) ;
Var JPath : JString; begin cls := jvm.JniEnv.FindClass('com/gdv/mapbuilder/datasources/shapefile/ShapefileVectorDataSource'); if cls = nil then begin ShowMessage('Klasse "ShapefileVectorDataSource" nicht gefunden'); exit; end; ConstructorMid := jvm.JniEnv.GetMethodID(cls, '<init>', '(Ljava/lang/String;)V') ; if constructorMid = nil then begin ShowMessage('Konstruktor nicht gefunden') ; exit ; end; JPath := Jvm.JniEnv.StringToJString(Path) ; Obj := jvm.JniEnv.NewObject(cls, ConstructorMid,[JPath]); if Obj = nil then ShowMessage('Fehler beim erzeugen der Instanz'); VectorLayer := JDVEctorLayer.create(Obj); end; {*create ShapeVector} destructor JDShapeFileVector.destroy ; begin Vectorlayer.destroy ; end; constructor JDVectorLayer.create(ShapeFile : JObject); begin cls := jvm.JniEnv.FindClass('com/gdv/mapbuilder/layer/MBVectorLayer'); if cls = nil then begin ShowMessage('Klasse "MBVectorLayer" nicht gefunden'); exit; end; ConstructorMid := jvm.JniEnv.GetMethodID(cls, '<init>', '(Lcom/gdv/mapbuilder/datasources/VectorDataSource;)V'); if constructorMid = nil then begin ShowMessage('Konstruktor nicht gefunden') ; exit ; end; Obj := jvm.JniEnv.NewObject(cls, ConstructorMid,[ShapeFile]); //ShapeFile ist hier eben vom Objekt ShapefileVectorbla und nicht von der verlangten unterklasse VectorDataSource if Obj = nil then ShowMessage('Fehler beim erzeugen der Instanz: VectorLayer'); end; kann es jetzt sein dass das Obj der Klasse Vector leyer trotzdem erzeugt wurde ?! |
Re: Delphi mit Java komunizieren
Zitat:
Das Problem ist, dass mir hier nicht ganz klar ist, warum der Code da überhaupt funktioniert. Du verwendest hier Konstruktoren, die nie inherited create aufrufen. Wenn das also dein Delphi-Code ist, solltest du schon an der Stelle ein Problem haben. Ansonsten ist mir auch nicht klar, wo die Variable obj herkommt. Die verwendest du hier relativ global, obwohl zwei völlig verschiedene Instanzen hier abgelegt werden sollen. Ob sie nicht zwischen den zwei Schritten noch an einer anderen Stelle verändert wird, kann ich so nicht sehen / sagen. Besser ist es, wenn du hier mit einer eigenen Variable arbeitest. An sich verwirrt mich auch etwas der Aufbau deines Programms. Dein JDVectorlayer benötigt ein JDShapeFileVector, soweit so klar. Jetzt würde ich sagen, dass JDVectorLayer also von der Existenz eines JDShapeFileVector wissen muss, nicht umgekehrt. Folglich sollte also JDShapeFileVector sich eine Instanz von JDShapeFileVector besorgen und diese verwenden... Also es wirkt auf micht wirklich etwas unglücklich modelliert. Worin jetzt der eigentliche Fehelr besteht kann ich so aber auch nicht sagen (sehe ihn nicht). Wie gesagt, globale Instanz von obj wäre ganz schlecht. |
Re: Delphi mit Java komunizieren
ich frag meinen arbeitgebeer mal wie weit ich das projekt hochladen darf .. aber eins kan ich sagen .. obj ist nicht global !
|
Re: Delphi mit Java komunizieren
Liste der Anhänge anzeigen (Anzahl: 1)
oder würde dir mal der komplette quelltext (ohne javadaten) erstmal reichen ?
|
Re: Delphi mit Java komunizieren
Versuch es mal mit dem Aufruf der geerbten Methode im Konstruktor:
Delphi-Quellcode:
Das gehört immer an erster Stelle in den Konstruktor. Damit wird überhaupt erst der Speicher reserviert, der für die Struktur benötigt wird. Vielleicht findest du dort schon deinen Fehler.
begin
inherited create; ... end; [Add] Ansonsten solltest du deine Klassen an sich noch etwas überarbeiten. Es ist immer schöner, wenn man die Schutzklassen die es gibt auch verwendet. Variablen solltest du immer als private deklarieren und den Zugriff über Properites nach aussen kapseln. Methoden sollten dann protected sein (wenn sie nur in der Klasse sichtbar sein sollen), sonst public. Der Zugriff auf Methoden (und imho auch Variablen) sollte qualifiziert werden (self. vorschreiben), damit ist immer klar, dass du eine Instanzvariable meist. [/Add] |
Re: Delphi mit Java komunizieren
gut also sachen wie obj nicht public lassen usw.
aber was meinst du mit inherited .. ich mein meine klassen in Delphi sind ja eigentlich nicht voneinander vererbt .. nur die in der JavaKlasse .. meine muss ja auch nich vererbt sein...... hm .. also kann ich einfach das ShapeFile der Klasse ShapeFileVectorData übergeben obwohl er nur die unterklasse FilVectordartablub haben will ?! .. da müsste es keinen komplikationen geben ?! .. hab ich denn mit JNI alles richtig programmiert ? |
Re: Delphi mit Java komunizieren
Zitat:
Statt
Delphi-Quellcode:
kannst du auch schreiben
TXYZ = class
... end;
Delphi-Quellcode:
Beide Blöcke haben die gleiche Aussage! Führst du einen eigenen Konstruktor ein, so musst du immer als erstes dafür sorgen, dass Speicher alloziert wird, die Adresse bekannt gegeben, etc. Irgendwoher muss Delphi ja dann wissen, wo jetzt dein Objekt liegt, welchen Typ es hat usw. Davon übernimmt der Vererbte Konstruktor von TObject schon einen guten Teil. Deswegen beginnt jeder Konstruktor immer mit der Zeile:
TXYZ = class(TObject)
... end; [delphi] constructor TXYZ.create; begin inherited create; end; [delphi] Also so sieht es bei direkten Erben von TObjekt aus, bei einem TControl würdest du natürlich dem inherited create noch den Owner mitgeben, aber der würde damit nur die geerbte Methode von TComponent aufrufen, dass geht dann wieder runter bis zum Parameterlosen create Aufruf eines TObject. Ähnlich sieht es dann beim Destruktor auf. Der muss ja letztlich sauber machen. Jetzt kannst du dich selbst drum kümmern, wie Delphi seine Klassen verwaltet (was keineswegs sinnvoll ist) oder du greifst hier dann einfach auf den geerbten Destruktor zurück. Überschreibst du also einen Destruktor, so muss die letzte Zeile inherited destroy heißen (die gibt einfach den Speicher des Objekts und aller Variablen, etc. frei). |
Re: Delphi mit Java komunizieren
ok .. es klappt alles .. ich habe eine methode vergessen aufzurufen .. daher kamen haltz folgefehler auf .. hatte aber was mit dem Java Programm zu tun.. werde aber trotzdem auch nochmal den delphiquellcode überarbeiten
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:39 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