2011-01-11 9 views
6

Da C Sto creando una DLL che viene caricata in Java. Io chiamo alcune funzioni C da java e chiamiamo anche funzioni Java da C (con tipi di dati non complessi) - funziona perfettamente.Come trasferire una struttura C in java utilizzando JNI?

ho lotta con il trasferimento di una struttura C a Java.

Ecco un piccolo esempio descriping quello che voglio fare. Non è completo e forse non è corretto perché il mio problema è che non sono sicuro di come farlo.

Il mio obiettivo è quello di passare una struttura del tipo "StructType" da C a Java al fine di utilizzare i valori nel programma Java.

In C

typedef struct { 
    unsigned char value1; 
    unsigned char value2; 
} StructType; 

void passStructToJava(StructType* myStruct) 
{ 
    class cls; 
    jmethodID mid; 

    /* GlobalEnv, GlobalObj are globlal values which are already set */ 
    cls = (*GlobalEnv)->GetObjectClass(GlobalEnv, GlobalObj); 
    mid = (*GlobalEnv)->GetMethodID(GlobalEnv, cls, "receiveStructFromC", "(LPackage/StructType;)V"); 

    (*GlobalEnv)->CallVoidMethod(GlobalEnv, GlobalObj, mid, myStruct); 
} 

In Java

public class StructType { 
public int value1; /* int because there is no uint8 type */ 
public int value2; 
} 

public StructType mMyStruct; 
public StructType getMyStruct() { 
    return mMyStruct; 
} 
public void setMyStruct(StructType myStruct) { 
    mMyStruct = myStruct; 
} 


public void receiveStructFromC(StructType myStruct) 
{ 
    setMyStruct(myStruct); 
} 

Grazie in anticipo per il vostro aiuto.
Steffen

risposta

0

Suggerirei di restituire un array int, nella misura in cui la struttura non è costituita da altro.

quanto per la restituzione dell'oggetto: è possibile creare un oggetto della classe StructType, riempire i valori con setter e restituirlo.

Gli esempi di codice necessarie si possono trovare here.

Proprio l'esempio, non ho controllare questo codice.

returnObj = (*env)->AllocObject(env, objClass); 
if (returnObj == 0) printf("NULL RETURNED in AllocObject()\n"); 
printf("Sizeof returnObj = %d\n", sizeof(returnObj)); 

(*env)->SetObjectField (env, returnObj, fid5, 
combinedEmployeeNameJava); 
(*env)->SetIntField (env, returnObj, fid6, combinedSalary); 
+0

Grazie Vladimir. La struttura è un po 'più complessa come nell'esempio e ho bisogno di usarla. Ma come posso accedere all'oggetto java dalla struttura nella funzione C per usare setter e getter (seguendo l'esempio)? –

+0

ha aggiornato la risposta. –

Problemi correlati