2012-03-09 11 views

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"); 
+0

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

+0

@Shubh Abre una nueva pregunta y agrega tu código e información de error. Chuck – Java42

+1

Para aquellos que se preguntan, 'class' se puede obtener con:' class = (* env) -> GetObjectClass (env, o); ' – Diego

Cuestiones relacionadas