java - logo - jni nazareno
Pasar tipos de datos de Java a C(o viceversa) usando JNI (1)
Si vas 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.
Ejemplo de objeto empleado:
public class Employee {
private int age;
public Employee(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
Llame a este código desde 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);
}
Podría tener funciones JNI como esta para pasar un objeto empleado de Java a C, como un argumento de método de trabajo:
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;
}
Al pasar un objeto de empleado de C a Java como un jobject, podría 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;
}
Usando JNI, ¿podemos pasar tipos de datos personalizados de Java a C (o viceversa)? Veo un mapeo 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).