2011-01-11 10 views
6

Desde C Estoy creando un archivo DLL que se carga en Java. Llamo algunas funciones C desde Java y también llamo a funciones Java desde C (con tipos de datos no complejos) - esto funciona bien.¿Cómo transferir una estructura C a java mediante el uso de JNI?

Lucho con la transferencia de una estructura C a Java.

Aquí hay un pequeño ejemplo que describe lo que quiero hacer. No está completo y tal vez no sea correcto porque mi problema es que no estoy seguro de cómo hacerlo.

Mi objetivo es pasar una estructura del tipo "StructType" de C a Java para utilizar los valores en el programa 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); 
} 

Gracias de antemano por su ayuda.
Steffen

Respuesta

0

Sugeriría que se devuelva una matriz int, ya que su estructura no consiste en nada más.

En cuanto a devolver el objeto: puede crear un objeto de su clase StructType, completar los valores con setters y devolverlo.

Se pueden encontrar los ejemplos de código necesarios here.

Solo el ejemplo, no he marcado este código.

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

Gracias Vladimir. La estructura es un poco más compleja que en el ejemplo y necesito usarla. Pero, ¿cómo puedo acceder al objeto java desde la estructura en la función C para usar los setters y getters (siguiendo el ejemplo)? –

+0

actualizó la respuesta. –

Cuestiones relacionadas