Visualizzazione dei risultati da 1 a 9 su 9

Discussione: C++ --> Java con JNI

  1. #1

    C++ --> Java con JNI

    Salve ragazzi ho un piccolo grande problema, mi è stato assegnato un progetto da fare in Java che richiami dei file Cpp i quali permettono il movimento di un Rover, il tutto ovviamente farlo tramite JNI. Il problema principale è questo: ho imparato ad utilizzare JNI in modo semplice (creare un semplice file in cpp che faccia la somma di due numeri, creare le librerie e richiamarlo da Java avendo il risultato). Quello che ora non ho capito è Come cavolo faccio a creare un interfaccia Cpp che tramite JNI implementi tutti quei fle Cpp?

    il prof ha riassunto il progetto in 4 steps:
    4) creare una classe Java che permetta l utilizzo ad alto livello del rover( muoviti, gira ecc)
    3) creare un framework in java che implementi tutti i file Cpp usando JNI
    2) creare un interfaccia Cpp(wrapper) che faccia da ponte tra il framework e i file del rover (cpp) tramite JNI
    1) testare i file Cpp del rover.

    il passo 1 e 4 sono semplici...ma come faccio a creare un interfaccia in Cpp che faccia da ponte? non basterebbe creare un wrapper per ogni classe?
    Joe

  2. #2
    Premessa: ti rispondo in base a quello che so io. Non voglio assolutamente mettere in discussione quello che ti ha detto il tuo professore, che sicuramente ne sa molto piu' di me.

    Non si richiamano i file Cpp da java, si richiamano dei metodi nativi che vengono dichiarati native nella classe java e che vengono si implementati in C/Cpp, ma che devono essere compilati in una libreria dinamica (.dll nel caso di Windows) prima di essere usati.

    Detto questo passiamo ai tuoi punti :

    3) la mia interpretazione di questo punto e' appunto creare una classe java con metodi native come ti ho detto sopra.

    4) la mia interpetazione di questo punto e' creare un header file (.h) per il codice Cpp dove ci sono le signatures dei metodi da implementare nativamente (cioe' in Cpp). tale file lo puoi generare automaticamente col comando javah che viene fornito quando installi la JDK (non la JRE quindi se usi Eclipse lo devi installare )

    Una volta che hai implementato i metodi in Cpp compili tutto in una .dll e la importi tramite System.loadLibrary()

  3. #3
    ciao, grazie x aver risposto...allora lui ha detto che devo creare un file Cpp che faccia da ponte tra la classe Java (contenete i metodi nativi) e i file .Cpp da rikiamare. Ora cos è qst file di ponte? lui l ha chiamato interfaccia, che permetta di usare gli altri file Cpp però attraverso Jni... xke ha dtt che jni ha dati particolari(jint,jshort...).

    io avrei creato un main che includi la libreria principale del rover. e l avrei richiamato dal programma Java che implementa qst metodo nativo. ma nn va bene

    quindi lui ha detto di creare un progetto java che abbia tutte le classi del progetto Cpp.. penso richiamandole (è un pò un casino enorme). poi qst interfaccia ma nn ho capito come posso crearla.. cioè sono piu di 12 file .cpp e ogni file ha metodi e classi
    Joe

  4. #4
    Allora secondo me il professore vuole che tu crei un un ulteriore file .cpp che non fa altro che richiamare tutti i metodi delle altre classi "c++", è un pattern comune si chiama Delegation.
    Dalla parte java dovrai creare un classe (interfaccia) jni che appunto vada a richiamare i metodi da te creati nel file .cpp.
    Faccio un esempio:
    codice:
    file1.cpp -> Classe pippo -> metodo A...Metodo B
    file2.cpp -> Classe pluto -> metodo C...Metodo D
    file3.cpp -> Classe paperino -> metodo E...Metodo F
    
    mioFile.cpp -> Classe MioFile :
    Metodi:
    metodoA()
    {
      pippo.metodoA();
    }
    ....
    metodoF()
    {
     paperino.metodoF();
    }

  5. #5
    si francesco e sono cavoli amari... cerco di spiegarmi meglio... esempio stupido:

    1 file.cpp che contiene l implementazione delle classi contenute nel relativo file.h

    2 creo un file C che include x esempio il "file.h" ma

    1: per richiamare un metodo da JNI devo campiare l intestazione

    filenuovo.cpp

    #include "file.h"
    #include "filenuovo.h" //che sarebbe l header di java

    JNIEXPORT void JNICALL main(JNIEnv *env, jclass obj)
    {
    //che deve fa?
    }
    l implementazione è tt nel "file.cpp" ma i file inclusi in file.h non hanno le intestazioni cambiate.

    file.cpp

    CComAdapter::~CComAdapter(){closeDevice();}

    per semplicità facciamo che contenga solo il distruttore.
    CComAdapter è la classe dichiarata in file.h
    Joe

  6. #6
    No molto probabilmente non hai capito tu, è appunto per questo motivo che devi creare un tuo file cpp (in modo da non dover cambiare gli altri.).
    Pensavo che fosse ovvio che nel tuo file (mi rifaccio al mio esempio) mioFile non avrai semplicemente motodoA ma avrai appunto la firma che ti viene obbligata da jni.

  7. #7
    si infatti a me il prof ha confuso e parecchio pure...
    allora correggimi se sbaglio...e scs cmq x la perdita d tempo XD

    ok creo questo nuovo file che obbligherà gli altri file cpp ad avere la firma di jni ma creo tt in una classe sono piu d 12 classi
    ma come faccio a dargli la firma se le dichiarazioni stanno nel file.h? non so se m spiego

    nel file .cpp io ho solo x esempio

    namespace pippo{implementazioni............................. .......................................}

    e tutto incluso li dentro

    nel file .h ho:
    class pluto{} ecc...
    Joe

  8. #8
    non stiamo parlando di dei file Cpp che hanno x esempio il metodo somma() che uno crea la classe java crea il metodo nativo e cambia la firma essnedo cmq semplice...
    è un progettone fatto da oltre 20 persone che ha uno spazio di nomi prp... c è una firma x il Namespace?
    Joe

  9. #9
    Allora facciamo una cosa levati dalla testa per il momento JNI.
    Supponi di avere 12 classi java con relativi metodi suddivisi nelle varie classi.
    codice:
    public class A{
       metodoA();
       metodoB();
    }
    public class B{
       metodoC();
    }
    Diciamo che adesso vuoi applicare il delegation pattern; quindi crei un nuova classe Delegation
    che non fà altro appunto che delegare
    codice:
    public class Delegation()
    {
        private A aInstance;
        private B bInstance;
    
        public Delegation()
        {
            aInstance = new A();
            bInstance = new B();
        }
    
        public void callMetodoA()
        {
            aInstance.metodoA();
         }
    ..... 
    }
    Ora io nella classe Delegation posso dichiarare i metodi come mi pare a piace non sono obbligato a rispettare le firme definiti in A etc...
    non stiamo parlando di dei file Cpp che hanno x esempio il metodo somma() che uno crea la classe java crea il metodo nativo e cambia la firma essnedo cmq semplice...
    Non ho mai detto che questo è la cosa migliore da fare o che sia la più semplice.
    Ma quando si tratta di JNI è una prassi comune, in quanto le librerie cpp etc... non vengono di solito pensate per essere usata da java.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.