Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2000
    Messaggi
    12

    lanciare motodi c++ da java

    Ciao,

    ho la necessità di eseguire un metodo di un processo in c++ da un programma java...

    qualcuno mi sa dare informazioni su come fare??

    grazie
    ciao

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    2,894
    Ci sono gli "include" inseriti nell'SDK...

    Cmq non sono pratico...


  3. #3
    probabilmente JNI dovrebbe fare al caso tuo ...
    23-08-2005: Udinese in cémpions lìg
    Questa estate l'ho passata a Tallin

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2000
    Messaggi
    12
    grazie,

    ma secondo te come è possibile accedere a metodi di un programma c++ che è sta girando, quindi un processo indipendente, da un programma java?
    jni permette anche questo o solo di scrivere programmi che hanno al loro interno linguaggi differenti?


  5. #5
    non ne ho idea
    ho solo dato una letta e visto che permetteva (nell'esempio) di chiamare il classico HelloWorld, solo che questo era stato scritto in c++
    Ma non ho assolutamente idea se si possa chiamare dei metodi da un progamma che sta già girando
    23-08-2005: Udinese in cémpions lìg
    Questa estate l'ho passata a Tallin

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    40
    mi sembra che da JNI puoi soltanto chiamare metodi C non C++, naturalmente puoi incapsulare le chiamate a funzioni C++ in semplici wrappers C:

    devi prima di tutto creare una library (.dll per microsoft o .so per *NIX) che esporta alcune funzioni C.

    queste funzioni devono seguire un determinato schema di nomi (mangling) e passaggio dei parametri.

    ad esempio supponiamo di avere una classe java Clazz e la library condivisa Library.dll e che dentro la classe ci sia un unico metodo C nativo invoke:

    package pack;

    public class Clazz
    {
    // automaticamente linka i tuoi metodi
    static { LoadLibrary("Library"); } // .dll

    native public void invoke(int a);
    }

    la tua library Library.dll dovrà contenere la seguente funzione C esportata (non mi ricordo come si fa sotto windows mi sembra extern "C" __NONRICORDO(dllexport))

    nota bene i nomi nella funzione C:

    #include "jni.h"

    class CClass
    {
    public:
    CCLass();
    virtual ~CClass();

    void Invoke(int a);
    };

    extern "C" __NONRICORDO(dllexport)
    void JNICALL Java_pack_Clazz_invoke(
    (JNIEnv* ENV, jobject THIS , jint a)
    {
    // ENV è un puntatore all'environment Java
    // THIS è un puntatore alla tua classe Java

    CClazz c;
    c.Invoke(a);
    }

    la tua classe CClazz puo risiedere tranquillamente in un'altra .dll e in questo caso devi esporla ed importarla nella tua dll; mentre se vuoi lanciare altri eseguibili .exe devi scrivere il codice che ti serve da C (se devi soltanto lanciare eseguibili interi da Java, non ti serve JNI ma puoi utilizzare la classe Process oppure Runtime.exec)

    sono stato stringatissimo ma se hai dubbi posta altre domande. e guarda anche la documentazione Sun.

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    40

    dimenticavo

    a questo punto da Java puoi fare:

    Clazz c = new Clazz();
    c.invoke(451);

    e il metodo della classe C++ CClazz sarà chiamato automaticamente con il parametro 451.

    per chiamare metodi di un programma in *esecuzione* la cosa è un po più complicata e bisogna sapere che sistema operativo stai usando.

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.