Здесь я создаю класс в JAVA, в котором у меня есть функция (обратный вызов), которую я должен вызывать из файла C.
class DSMInitializeClassParameter {
/**
* Callback function for DSM Initialize.
*/
public void DSMInitializeCallback( ) {
// Write Message To Logs.
System.out.println( "Dsm Initialize Callback called." );
}
}
Для этого я создал собственный метод, который должен быть вызван.
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);
}
В C файле есть следующее:
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 );
}
Как вы можете видеть, я хочу вызвать функцию (*env)->CallVoidMethod(env, classObject, mid);
из dsmInitializeCall
, но как я могу назвать ее, если у меня нет env
, classObject
и mid
Я пытаюсь статикой, но она не работает.