2011-01-11 5 views
6

À partir de C Je crée une DLL qui est chargée en Java. J'appelle certaines fonctions C de java et j'appelle aussi des fonctions Java de C (avec des types de données non complexes) - cela fonctionne bien.Comment transférer une structure C vers Java en utilisant JNI?

Je me bats avec le transfert d'une structure C vers Java.

Voici un petit exemple décrivant ce que je veux faire. Ce n'est pas complet et peut-être pas correct parce que mon problème est que je ne suis pas sûr de savoir comment le faire.

Mon but est de passer une structure du type "StructType" de C vers Java afin d'utiliser les valeurs dans le programme Java.

En 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); 
} 

En 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); 
} 

Merci d'avance pour votre aide.
Steffen

Répondre

0

Je suggère de renvoyer un tableau int, dans la mesure où votre structure ne consiste en rien d'autre. Comme pour retourner l'objet: vous pouvez créer un objet de votre classe StructType, remplir les valeurs avec setters et le renvoyer.

Les exemples de code nécessaires peuvent être trouvés here.

Juste l'exemple, je n'ai pas vérifié ce code.

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

Merci Vladimir. La structure est un peu plus complexe que dans l'exemple et je dois l'utiliser. Mais comment puis-je accéder à l'objet java à partir de la structure dans la fonction C pour utiliser les setters et getters (en suivant l'exemple)? –

+0

a mis à jour la réponse. –

Questions connexes