2012-04-24 11 views
9

Ho uno strucutre complesso nel codice C sulla mia applicazione Android e vorrei usarlo nel lato Java. Ho fatto qualche ricerca con google e in stackoverflow, quindi ho creato la classe java dalla mia strucutre C, ma ora come ottenerla in Java.Come passare una struttura complessa tra C e Java con JNI su Android NDK

ho trovato queste informazioni, di fare un puntatore nella classe e utilizzare questo sul lato C:

Get the field ID : (*env)->GetFieldID(...) 
Get the pointer : (*env)->GetLongField(...) 
Set the pointer : (*env)->SetLongField(...) 

Ma io non capisco come funziona davvero ...

Sopra, puoi trovare quello che ho fatto fino ad ora ... non tanto! Sul lato C:

ComplexStructure Java_com_main_MainActivity_listenUDP(JNIEnv* env, jclass clazz) 
{ 
    int i,taille; 
    ComplexStructure myStruct;  
    taille = -1;  
    taille = recvfrom(socket, &myStruct, sizeof(ComplexStructure), 0, &rcvAddr, &sizeOfSock); 
    if(taille != -1) 
    { 
     return myStruct; 
    } 
    return NULL; 
} 

E sul lato Java:

public void getFromUDP() { 

    ComplexClass myClass = new ComplexClass(); 
    myClass = listenUDP();    
} 

@Override 
public void run() { 
    initUDP(); 
    getFromUDP(); 
} 


public static native ComplexClass listenUDP(); 
public static native void initUDP(); 
public static native void closeUDP(); 

/** Load jni .so on initialization */ 
static { 
    System.loadLibrary("native-interface"); 
} 

EDIT: voglio aggiungere che la mia struttura è molto complesso come quello:

typedef struct{ 
    TYPE_A myStructA; 
    TYPE_B myStructB; 
    TYPE_C myStructC; 
    TYPE_D myStructD; 
}ComplexStructure; 

typedef struct{ 
    float rad; 
    int size; 
    bool isEmpty; 
}TYPE_A; 

typedef struct{ 
    float rad; 
    bool isEmpty; 
    float color; 
    int temp; 
}TYPE_B; 

typedef struct{ 
    int temp; 
    float rain; 
    bool isEmpty; 
}TYPE_C; 

typedef struct{ 
    float rad; 
    int idPerson; 
    bool isOnTime; 
}TYPE_D; 

Ancora più complesso, solo un esempio per mostrarti com'è!

risposta

8

Non è possibile passare le strutture C grezzi in Java e si aspettano di trattare queste le strutture come classi. Devi creare una classe per la tua struttura. Vedo che l'hai già fatto, quindi l'unica cosa che devi fare è convertire questa struttura in un'istanza della classe.

Il codice sul lato Java:

public static native ComplexClass listenUDP(); 

si tradurrà in:

JNIEXPORT jobject JNICALL Java_com_main_MainActivity_listenUDP(JNIEnv *env, jclass); 

In quel codice C, è necessario caricare il ComplexClass utilizzando la funzione env->FindClass();. Quindi, per creare una nuova istanza di tale classe (semplifica la questione se si dispone di un costruttore con parametri zero), è necessario caricare una firma del metodo del costruttore e "richiamarla" nel metodo env->NewObject(). codice completo:

jclass complexClass = env->FindClass("/com/main/ComplexClass"); 
jmethod constructor = env->GetMethodId(complexClass, "<init>", "()com/main/ComplexClass"); //The name of constructor method is "<init>" 
jobject instance = env->NewObject(complexClass, constructor); 

Poi è necessario impostare i campi di questa classe secondo i env->setXXXField();. Se si dispone di più oggetti come campi e si desidera eventualmente crearli, ripetere la procedura sopra per un altro oggetto.

Questo sembra molto complicato, ma questo è il prezzo per l'utilizzo nativo C in codice Java gestito.

+0

Ok, vi ringrazio molto per la risposta, è molto disponibile. Come dici tu, è molto complicato, ho pensato che fosse possibile copiare facilmente la struttura nella classe, ma non è ... Perché la mia struttura ha molti oggetti/campi, quindi se devo aggiungere manualmente tutti i parametri, io passerà giorni su di esso. Quindi, è più semplice ricevere direttamente in Java il pacchetto UDP dalla mia applicazione C ?? Grazie mille @Jakub Závěrka – Bibu

+1

@ Martin Date un'occhiata ai Datagrammi: http://docs.oracle.com/javase/tutorial/networking/datagrams/index.html –

+0

Sì, lo so come usare DatagramSocket et DatagramPacket, ma Non so come recuperare i miei dati :), per una stringa è abbastanza semplice, ma per una struttura ... – Bibu

Problemi correlati