Delphi-PRAXiS
Seite 6 von 8   « Erste     456 78      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Delphi mit Java komunizieren (https://www.delphipraxis.net/73102-delphi-mit-java-komunizieren.html)

bucchi 20. Sep 2006 15:08

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:
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);
   }
}
Das ganze wurde in einem .jar verpackt (2 Klassen "HelloWorld" und "HelloWorld2")
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:
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);
   }
}
Und hier hänge ich wieder...
Sobald ich den Logger einschalten will, findet er die Klasse nicht.
Kann mir jemand weiterhelfen?

Greez
Bucchi

Simon1988 20. Sep 2006 15:14

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 ?

Simon1988 16. Okt 2006 12:06

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:
 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');
Wenn ich haber die funktion newObject aufruf kommt ein fehler .. und zwar folgender :
"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

Der_Unwissende 18. Okt 2006 13:42

Re: Delphi mit Java komunizieren
 
Zitat:

Zitat von bucchi
Hallo Miteinander, Ciao der Unwissende

Ciao bucchi

Zitat:

Zitat von bucchi
Das ganze wurde in einem .jar verpackt (2 Klassen "HelloWorld" und "HelloWorld2")
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:
Und hier hänge ich wieder...
Sobald ich den Logger einschalten will, findet er die Klasse nicht.
Kann mir jemand weiterhelfen?

Sorry erstmal, dass ich erst jetzt antworte (oder hatte sich das schon geklärt? Hatte irgendwie keine Benachrichtigung mehr bekommen (gilt auch für alle folgenden Probleme).

Liegt denn das jar File zu log4j im Klassenpfad? Nur da kann dann eine solche Klasse gefunden werden.

Gruß Der Unwissende

Der_Unwissende 18. Okt 2006 13:52

Re: Delphi mit Java komunizieren
 
Zitat:

Zitat von Simon1988
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 ?

Hier wäre es ja schön, wenn du sagen würdest, wo dein (Halb?-)Wissen herkommt. Wie schon (öfters) gesagt steht alles was man wissen soll/muss in den Java Docs, unter JNI. Da findest du dann
Zitat:

Zitat von SUN
For example, the Java method:
long f (int n, String s, int[] arr);

has the following type signature:
(ILjava/lang/String;[I)J

Hier sollte sich deine Frage dann leicht klären lassen. Dass mit dem Lfully-qualified-class findest du auch auf der gleichen Seite. Jedenfalls wird die tatsächliche Qualifikation über / vorgenommen. Ein / ersetzt dabei den Punkt, den du hinter ein Packagenamen setzt.

Gruß Der Unwissende

PS.: Wegen der Dauer der Antwort gilt das gleiche wie im Beitrag zuvor

Der_Unwissende 18. Okt 2006 14:01

Re: Delphi mit Java komunizieren
 
Zitat:

Zitat von Simon1988
Ich hab hier maln quelltext Form1.MiniSC.MBMap.obj ist hierbei das objekt der Klasse MBMap , dass ich schon erzeugt habe ..
Delphi-Quellcode:
 Obj := jvm.JniEnv.NewObject(cls, ConstructorMid, [Form1.MiniSC.MBMap.Obj]);
 if Obj = nil then
  ShowMessage('Fehler beim erzeugen der Instanz');
Wenn ich haber die funktion newObject aufruf kommt ein fehler .. und zwar folgender :
"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"
ist meine übergabe [Form1.MiniSC.MBMap.Obj]); überhaupt richtig ?! .. oder übergeb ich da was anderes als das Objekt (Der klasse JObject)

Du sagst, du hast schon eine Instanz von MBMap, was genau ist denn MBMap? Ist das eine Delphi Klasse? Oder hast du hier ein Java-Objekt? Da musst du dann wirklich aufpassen, denn sonst treffen hier zwei völlig verschiedene Welten aufeinander.
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

Simon1988 23. Okt 2006 19:29

Re: Delphi mit Java komunizieren
 
hey, also Form1.MiniSC.MBMap.Obj ist hierbei ein JObjekt und wurde folgender maßen erzeugt :


Delphi-Quellcode:
 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');
soweit ich das gesehen habe ist es auch kein fehler aufgetreten .. MBMap wurde erzeug.

Die MBMenuBar (abstammung von der MenuBar in Java) wird nun erzeugt .. dafür muss ich diese MBMap übergeben

Delphi-Quellcode:
 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');
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

Der_Unwissende 25. Okt 2006 09:19

Re: Delphi mit Java komunizieren
 
Hi,
Zitat:

Zitat von Simon1988
hey, also Form1.MiniSC.MBMap.Obj ist hierbei ein JObjekt und wurde folgender maßen erzeugt :
...

soweit ich das gesehen habe ist es auch kein fehler aufgetreten .. MBMap wurde erzeug.

Die MBMenuBar (abstammung von der MenuBar in Java) wird nun erzeugt .. dafür muss ich diese MBMap übergeben

Delphi-Quellcode:
 ...
 Obj := jvm.JniEnv.NewObject(cls, ConstructorMid, [Form1.MiniSC.MBMap.Obj]);
 if Obj = nil then
  ShowMessage('Fehler beim erzeugen der Instanz');
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

Ja, worin genau dein Fehler liegt kann ich mangels kompeletten Code nicht sagen. Wenn die Erzeugung der MBMap nicht fehlschlägt, dann sollte eigentlich alles geklappt haben. Das dir also die Komponente fehlt ist sehr unwahrscheinlich. Interessanter finde ich hingegen, dass du die Instanz im zweiten Konstruktor aufruf als Form1.MiniSC.MBMap.Obj übergibst, während sie eigentlich nur als Obj angelegt wird. Ob du hier mit einem with Form1.MiniSC.MBMap arbeitest oder die Referenz entsprechend kopierst oder oder oder kann ich natürlich nicht sagen, aber das wäre eine mögliche Fehlerquelle.
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

Simon1988 26. Okt 2006 13:28

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)

Der_Unwissende 26. Okt 2006 13:35

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:
public class ShapeVectorDataSource extends VectorDataSource { ...
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 Uhr.
Seite 6 von 8   « Erste     456 78      

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