2010-03-23 10 views
27

¿Usando JNI podemos pasar tipos de datos personalizados de Java a C (o viceversa)? Veo una asignación de tipos de datos primitivos a tipos en C, pero no estoy muy seguro de si podemos enviar nuestros propios tipos de datos (por ejemplo, enviar o devolver un objeto de Employee o algo).Pasar tipos de datos de Java a C (o viceversa) usando JNI

+0

Puede usar [JNA] (https://github.com/twall/jna/) para pasar estructuras fácilmente. JNA le permite escribir su enlace completamente en código Java. :-) –

+0

Puedes. Si desea facilitar la traducción de Java/C, consulte [Swig] (http://www.swig.org/), que le permite traducir [entre estructuras Java y C/C++] (http: // www. swig.org/Doc1.3/Java.html) de manera directa .. –

Respuesta

61

Si va a hacer esto con muchos objetos, algo como Swig sería lo mejor. Puede usar el tipo de objeto de trabajo para pasar objetos personalizados. La sintaxis no es buena, quizás haya una mejor manera de escribir esto. objeto

Ejemplo Empleado:

public class Employee { 
    private int age; 

    public Employee(int age) { 
     this.age = age; 
    } 

    public int getAge() { 
     return age; 
    } 
} 

llamada el código de algún cliente:

public class Client { 
    public Client() { 
     Employee emp = new Employee(32); 

     System.out.println("Pass employee to C and get age back: "+getAgeC(emp)); 

     Employee emp2 = createWithAge(23); 

     System.out.println("Get employee object from C: "+emp2.getAge()); 
    } 

    public native int getAgeC(Employee emp); 
    public native Employee createWithAge(int age); 
} 

Usted podría tener funciones JNI como este para pasar un objeto empleado de Java a C, como método jobject argumento:

JNIEXPORT jint JNICALL Java_Client_getAgeC(JNIEnv *env, jobject callingObject, jobject employeeObject) { 
    jclass employeeClass = (*env)->GetObjectClass(env, employeeObject); 
    jmethodID midGetAge = (*env)->GetMethodID(env, employeeClass, "getAge", "()I"); 
    int age = (*env)->CallIntMethod(env, employeeObject, midGetAge); 
    return age; 
} 

Pasando un objeto empleado de C a Java como jobje ct, puede usar:

JNIEXPORT jobject JNICALL Java_Client_createWithAge(JNIEnv *env, jobject callingObject, jint age) { 
    jclass employeeClass = (*env)->FindClass(env,"LEmployee;"); 
    jmethodID midConstructor = (*env)->GetMethodID(env, employeeClass, "<init>", "(I)V"); 
    jobject employeeObject = (*env)->NewObject(env, employeeClass, midConstructor, age); 
    return employeeObject; 
} 
+2

Tengo problemas con "LEmployee"; Parte que probé con "com.pak1.Employee" y con "Lcom.pak.Employee;" pero no hay resultado, ninguna idea? – Lukap

+1

@Lukap: si su clase es com.pak.Employee, la firma de la clase será "Lcom/pak/Employee;" – nautilusvn

+0

¿Tiene una idea de cómo funciona para 'String'? – mafioso

Cuestiones relacionadas