¿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
Respuesta
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;
}
Tengo problemas con "LEmployee"; Parte que probé con "com.pak1.Employee" y con "Lcom.pak.Employee;" pero no hay resultado, ninguna idea? – Lukap
@Lukap: si su clase es com.pak.Employee, la firma de la clase será "Lcom/pak/Employee;" – nautilusvn
¿Tiene una idea de cómo funciona para 'String'? – mafioso
- 1. pasar punteros entre C y Java a través de JNI
- 2. Datos binarios de JNI Stream de C++ a Java
- 3. Cómo enviar eventos/señal de C a Java en JNI
- 4. llamando a la función java desde c usando jni
- 5. JNI: pasando bytes de C++ a java
- 6. ¿Cómo pasar datos de Javascript a PHP y viceversa?
- 7. Pasar de los tipos Java a los tipos MATLAB
- 8. Pasando punteros entre C y Java a través de JNI
- 9. Convertir tipos JNI de tipos nativos
- 10. Devolver una clase C++ a Java a través de JNI
- 11. Pasar un Safearray de tipos personalizados de C++ a C#
- 12. ¿Pasar datos de Java Servlet a JSP?
- 13. cómo pasar un valor a C++ desde python y viceversa?
- 14. Transmitir un tipo largo de C++ a un jlong JNI
- 15. JNI - ¿Cómo hacer una devolución de llamada desde C++ o C a Java?
- 16. ¿Los miembros de la entidad deberían ser tipos de datos primitivos o tipos de datos Java?
- 17. Pasar un marco de datos desde-a R y C usando .call()
- 18. ¿Hay alguna forma de pasar una Java Array a C a través de JNI sin hacer una copia?
- 19. ¿Sugerencias para pasar de C# a Java?
- 20. PHP a C# y viceversa
- 21. Acceso a un objeto Java en un objeto Java en C usando JNI
- 22. JNI - Conversión de jobject que representa Basic Java Objects (Boolean) a tipos básicos nativos (bool)
- 23. ¿Cómo pasar estructuras C de ida y vuelta al código de Java en JNI?
- 24. Cómo pasar matriz (array de tiempo en Java) de Java a C++ utilizando trago
- 25. convertir vector a jobject en C++/JNI?
- 26. Transferencia de cadenas de doble byte (WCHAR) de C++ a Java a través de JNI
- 27. JNI Invocation API - NoClassDefFoundError (C/Java)
- 28. Tipos de datos primitivos multiplataforma en C++
- 29. ¿Es mejor pasar por valor o por referencia para los tipos de datos básicos?
- 30. Pasar referencias a un constructor C++ y guardarlos en tipos de referencia o no referencia
Puede usar [JNA] (https://github.com/twall/jna/) para pasar estructuras fácilmente. JNA le permite escribir su enlace completamente en código Java. :-) –
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 .. –