Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    724

    [delphi, java] errore passaggio funzione

    ho creato questa funzioncina delphi che passata un stringa come parametro me la modifica e la ritorna. Non voglio usare una function perche poi devo aggiungere altri parametri di tipi diversi da farmi ritornare
    codice:
    x:String='cio';
    procedure Java_Ppt_GetSlide(PEnv: PJNIEnv; Obj: JObject;var title:JString; var keys:JString); stdcall;
    begin
       title:=JString(x);
    end;
    exports Java_Ppt_GetSlide;
    la richiamo in java con la Jni (procedimento corretto testato con altri metodi)ma non mi modifica la stringa passata, cioè lascia il valore che gli ho assegnato in java cioè "c"
    codice:
    native public void GetSlide(String title, String keys);
       static
      {
        System.loadLibrary("PptDLL");
      }
    
    String title1="c";
    int keys=2;
       GetSlide(title1,keys);
    jTFtitolo.setText(title1);
    dove ho sbagliato??

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,282
    Il tipo JString com'è definito?

    Inoltre, nel codice Java, non vedo chiaramente la chiamata alla funzione che hai inserito nella DLL in Delphi...o mi è sfuggita?

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    724
    Jstring è il tipo di dato da usare per le strighe se voglio importare il codice delphi in java con la JNI(Java Native Interface)(http://home.pacifier.com/~mmead/jni/delphi/)


    la chiamata è qua


    codice:
    native public void GetSlide(String title, String keys);
       static
      {
        System.loadLibrary("PptDLL");
      }
    
    String title1="c";
    int keys=2;
       GetSlide(title1,keys); jTFtitolo.setText(title1);

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,282
    Originariamente inviato da perzem
    Jstring è il tipo di dato da usare per le strighe se voglio importare il codice delphi in java con la JNI(Java Native Interface)(http://home.pacifier.com/~mmead/jni/delphi/)
    Ok, prendo atto.

    Originariamente inviato da perzem
    la chiamata è qua
    La chiamata fa riferimento ad una routine GetSlide, mentre nella DLL ha nome Java_Ppt_GetSlide. :master:

    Scusa se rispondo facendo altre domande, ma è tanto per entrare nella problematica.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    724
    codice:
    Java_Ppt_GetSlide
    questo modo di dichiarare un metodo fa parte sempre della JNI.
    linguaggio_nomeclasse_nomemetodo

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,282
    Da quanto ho letto nel sito che mi hai segnalato, occorre convertire le stringhe da JString a string e viceversa usando apposite funzioni dell'API JNI della libreria; ad esempio:
    codice:
    Str := JVM.JStringToString(W);
    Prova a dare un'occhiata agli esempi di codice sul sito stesso.

    Nella tua implementazione Delphi, mi pare che tu abbia fatto un puro e semplice "cast" e non sono sicuro sia sufficiente.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    724
    ho fatto così ma mi da un errore estermo alla jvm che salva in un file .txt dicendo che ha poblema ad accedere al metodo getslide
    codice:
    x:String='cio';
    procedure Java_Ppt_GetSlide(PEnv: PJNIEnv; Obj: JObject;var title:JString; var keys:JString); stdcall;
    begin
       JVM := TJNIEnv.Create(PEnv);
         title1:= JVM.JStringToString(title);
         title1:=(x);
    end;
    exports Java_Ppt_GetSlide;
    potrebbe essere che devo liberare la variabile con un'istruzione del tipo
    codice:
    JVM.ReleaseStringChars(str:JObject,const Chars:PJChar);
    dove il primo parametro sarà title1 e nel secondo non so cosa mettere.
    Ho trovato questo metodo per prendere una stringa
    codice:
    JVM.GetStringChars(str:Object,isCopy:boolean):PJChar;
    mi sembrerebbe utile però restituisce un PJChar che non so cosa sia e non riesco poi a convertirlo a stringa per modificarlo

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    724
    Ho trovato questi metodi presi dalla JVM e sono

    codice:
    JVM.GetStringChars(str:JObject,isCopy:boolean):PJchar;  
    
    JVM.GetStringUTFChars(str:JObject,isCopy:boolean):PAnsiJchar;  
    
    JVM.ReleaseStringChars(str:JObject,const Chars:pjchar);


    Il primo prende la JString e la trasforma in un puntarore a Jchar, il secondo invece ad un puntatore ad AnsiChar

    Il terzo invece rilascia la viriabile JString

    Adesso dovrei prendere la variabile con il primo o secondo metodo trasformarla in Stringa accettata da delphi e modificarla.Poi portarla ad PAnsiChar ed infine a jString con questo metodo



    codice:
    JVM.StringToJString(const Astring:PAnsiChar)


    ed infine liberarla con l’ultimo metodo.

    Il mio problema non essendo esperto di delphi sono le conversioni da un tipo all’altro, cioè:

    PJchar -> String

    PAnsichar -> String

    String ->PAnsiChar

    Mi puoi dare una mano??

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,282
    Originariamente inviato da perzem
    Il mio problema non essendo esperto di delphi sono le conversioni da un tipo all’altro, cioè [...]
    Mi puoi dare una mano??
    Sarò rapido - purtroppo - perchè ho del lavoro da sbrigare oggi, tuttavia cerco di fornirti qualche suggerimento, considerando sempre il fatto che non sono ben inserito nella problematica in quanto non mi è mai capitato di avere a che fare con la libreria che stai utilizzando.

    Dal lato Delphi, posso assicurarti che le conversioni da PChar a string vengono effettuate automaticamente dall'ambiente usando un semplice typecast; ad esempio, se una funzione richiede un parametro di tipo PChar, puoi tranquillamente passare una stringa in questo modo:
    codice:
    var
      MyString: string;
    begin
      MyFunction(PChar(MyString));
    end;
    Delphi converte automaticamente il tipo di stringa.

    Per quanto riguarda, invece, i tipi supportati dalla libreria che utilizzi, credo che ogni conversione da "tipi Delphi" a "tipi JNI" debba essere fatta utilizzando le funzioni che hai a disposizione nella libreria (che purtroppo non conosco in modo approfondito).

    Eventualmente, cerca nella documentazione o negli esempi scaricabili un'implementazione simile a quella che devi realizzare tu, osservando quali pratiche vengono impiegate, quali sono le routine coinvolte ed indagando poi, dal sito stesso o con ricerche su Google, sul significato della routine stessa e dei parametri che si aspetta, nonchè del valore di ritorno (se esiste).


    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.