Tengo una aplicación Java que invoca el código C++/C nativo. El código C++/C necesita devolver la llamada a Java. ¿Podría darme algunos ejemplos de cómo hacer esto?JNI - ¿Cómo hacer una devolución de llamada desde C++ o C a Java?
26
A
Respuesta
23
Existen muchas formas válidas para realizar una devolución de llamada desde Java desde C/C++. Voy a mostrarte una técnica que usa C (env fácil de ajustar para C++) que hace que sea bastante fácil pasar datos del código nativo al código de Java. Este ejemplo pasa cadenas (fácil de modificar para cualquier tipo de datos).
en código nativo, cree lo siguiente:
// Globals
static jmethodID midStr;
static char * sigStr = "(Ljava/lang/String;ILjava/lang/String;)V";
// Init - One time to initialize the method id, (use an init() function)
midStr = (*env)->GetMethodID(env, class, "javaDefineString", sigStr);
// Methods
static void javaDefineString(JNIEnv * env, jobject o, char * name, jint index, char * value) {
jstring string = (*env)->NewStringUTF(env, name);
(*env)->CallVoidMethod(env, o, midStr, string, index, (*env)->NewStringUTF(env, value));
}
en código Java crear lo siguiente:
Map<String, String> strings = new HashMap<String, String>();
// Never call this from Java
void javaDefineString(String name, int index, String value) {
String key = name + "." + index;
strings.put(key, value);
}
uso nativo para enviar datos:
javaDefineString(env, o, "Greet", 0, "Hello from native code");
javaDefineString(env, o, "KeyTimeout", 0, "one second");
javaDefineString(env, o, "KeyTimeout", 1, "two second");
el uso de Java para recibir datos:
System.out.println(strings.get("Greet.0");
System.out.println(strings.get("KeyTimeout.0");
System.out.println(strings.get("KeyTimeout.1");
Cuestiones relacionadas
- 1. No puedo hacer una llamada desde C++ a Java usando JNI
- 2. Devolver una clase C++ a Java a través de JNI
- 3. devolución de llamada desde C++ al objetivo c
- 4. Llamada a la función c desde Java
- 5. Devolución de llamada desde Delphi dll a la aplicación C#
- 6. Devolución de llamada en C#
- 7. C# C++ devolución de llamada de interoperabilidad
- 8. llamando a la función java desde c usando jni
- 9. devolución de llamada en C#, orden de llamada y devolución
- 10. Datos binarios de JNI Stream de C++ a Java
- 11. JNI: pasando bytes de C++ a java
- 12. Devolución de llamada en C#
- 13. JNI y Java: ¿cómo hacer o hacer llamadas llamando a hormiga?
- 14. Cómo enviar eventos/señal de C a Java en JNI
- 15. ¿Cómo llamar a C++ desde Java?
- 16. C# - Cómo hacer una llamada HTTP
- 17. SWIG enlaces C++ con devolución de llamada
- 18. ¿Cómo implemento una devolución de llamada en C++?
- 19. ¿Qué sucede si invoco una función java desde múltiples hilos de C con JNI?
- 20. Utilice C++ con JNI
- 21. Cómo realizar una devolución de llamada en Objective-C
- 22. Pasando punteros entre C y Java a través de JNI
- 23. Devolución de llamada orientada a objetos para C++?
- 24. C# HttpRequest asíncrono múltiple con una devolución de llamada
- 25. pasar punteros entre C y Java a través de JNI
- 26. Llamar a cualquier método Java desde C#
- 27. JNI Invocation API - NoClassDefFoundError (C/Java)
- 28. Biblioteca compartida de C++ llamada desde C
- 29. C++ Java wrapper construction con JNI
- 30. Métodos de llamada C del código C++/Java/C#?
Hola lo intenté, pero esto dice ... "error: 'javaDefineString' no fue declarado en este ámbito". Como no es un método JNI, ¿cómo puedo tener una declaración en el archivo de encabezado .h? ¿Cualquier sugerencia? – CoDe
@Shubh Abre una nueva pregunta y agrega tu código e información de error. Chuck – Java42
Para aquellos que se preguntan, 'class' se puede obtener con:' class = (* env) -> GetObjectClass (env, o); ' – Diego