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'è!
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
@ Martin Date un'occhiata ai Datagrammi: http://docs.oracle.com/javase/tutorial/networking/datagrams/index.html –
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