Aquí creo una clase en JAVA en la que tengo una función (devolución de llamada) a la que debo llamar desde el archivo C.Cómo crear un indicador de entorno JNI estático?
class DSMInitializeClassParameter {
/**
* Callback function for DSM Initialize.
*/
public void DSMInitializeCallback() {
// Write Message To Logs.
System.out.println("Dsm Initialize Callback called.");
}
}
Para eso he creado el método nativo que debe llamarse.
public class DsmLibraryTest extends Activity {
// Some code ....
// Create a DSMInitializeClassParameter class object.
DSMInitializeClassParameter object = new DSMInitializeClassParameter();
// Call native method with given object.
nativeMethod(object);
// Some code ....
// Implementation of native method.
public native int nativeMethod(DSMInitializeClassParameter classObject);
}
En archivo C He siguientes:
dsmResult_t dsmInitializeCall(dsmResult_t status, void * pUserData, dsmEvent_t * hEvent) {
(*env)->CallVoidMethod(env, classObject, mid);
}
JNIEXPORT jint JNICALL Java_com_Dsm_Test_DsmLibraryTest_nativeMethod(JNIEnv* env, jobject obj, jobject classObject) {
// This function loads a locally-defined class. It searches the directories and zip
// files specified by the CLASSPATH environment variable for the class with the specified name.
jclass cls = (*env)->FindClass(env, "com/Dsm/Test/DSMInitializeClassParameter");
// Get java Method.
jmethodID mid = (*env)->GetMethodID(env, cls, "DSMInitializeCallback", "()V");
// If no method was found return -1;
if(mid == NULL) {
return -1;
}
// Call DSM Initialize Callback Function and return value.
return dsmInitialize(dsmInitializeCall, NULL);
}
cómo se puede ver que quiero llamar (*env)->CallVoidMethod(env, classObject, mid);
de dsmInitializeCall
función, pero la forma en que se puede llamar si no tengo env
, classObject
y mid
Intento con estática pero no funciona.
Muchas gracias, revisaré mañana en mi lugar de trabajo ... ¿Y puede ser que me pueden ayudar en esta cuestión? http://stackoverflow.com/questions/6152747/jni-not-support-types-as-void-unsigned-int-what-to-do –
Y por qué no puedo usar jclass cls = (* env) -> GetObjectClass (env, classObject); En lugar de jclass cls = (* env) -> FindClass (env, "com/Dsm/Test/DSMInitializeClassParameter"); Creo que classObject es un objeto de mi clase en el que tengo DSMInitializeCallback, así que puedo obtener clases de ese objeto. Pero cuando intento la aplicación se colgó con Dalvic VM Error ... ¿Pero por qué? –
http://stackoverflow.com/questions/6184678/where-can-i-see-message-from-jni-printf-in-eclipse –