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 6 von 8   « Erste     456 78      
bucchi

Registriert seit: 23. Aug 2006
2 Beiträge
 
#51

Re: Delphi mit Java komunizieren

  Alt 20. Sep 2006, 16:08
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
  Mit Zitat antworten Zitat
Simon1988

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

Re: Delphi mit Java komunizieren

  Alt 20. Sep 2006, 16:14
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 ?
  Mit Zitat antworten Zitat
Simon1988

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

Re: Delphi mit Java komunizieren

  Alt 16. Okt 2006, 13:06
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
  Mit Zitat antworten Zitat
Der_Unwissende

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

Re: Delphi mit Java komunizieren

  Alt 18. Okt 2006, 14:42
Zitat von bucchi:
Hallo Miteinander, Ciao der Unwissende
Ciao bucchi

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
  Mit Zitat antworten Zitat
Der_Unwissende

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

Re: Delphi mit Java komunizieren

  Alt 18. Okt 2006, 14:52
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 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
  Mit Zitat antworten Zitat
Der_Unwissende

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

Re: Delphi mit Java komunizieren

  Alt 18. Okt 2006, 15:01
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
  Mit Zitat antworten Zitat
Simon1988

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

Re: Delphi mit Java komunizieren

  Alt 23. Okt 2006, 20:29
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
  Mit Zitat antworten Zitat
Der_Unwissende

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

Re: Delphi mit Java komunizieren

  Alt 25. Okt 2006, 10:19
Hi,
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
  Mit Zitat antworten Zitat
Simon1988

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

Re: Delphi mit Java komunizieren

  Alt 26. Okt 2006, 14:28
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)
  Mit Zitat antworten Zitat
Der_Unwissende

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

Re: Delphi mit Java komunizieren

  Alt 26. Okt 2006, 14:35
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 8   « Erste     456 78      


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 10:50 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