PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehrere Callback-Methoden über JNI



SirLacy
21-01-2008, 14:35
Hallo,

ich habe eine Klasse, die über JNI eine Native Methode aufruft. Von der C++-Seite aus müssen zwei verschiedene Java-Methoden aufgerufen werden können. Leider klappt es immer nur mit einer, ich bekomme zwar die jmethodID für die zweite Methode, aber beim Aufruf stürzt die VM ab.

Auf Java-Seite gibt es eine überladene Methode callback, einmal als callback(int), dann als callback(int, long, String). Das Beispiel zeigt in Kürze, was ich gemacht habe und beim zweiten Aufruf stürzt Java einfach ab. Hab ich irgendetwas Grundsätzliches falsch gemacht?



JNIEXPORT jint JNICALL Java_my_application_doNative(JNIEnv *env, jobject obj, jstring str, jint integer) {
//erste Callback-Methode erzeugen
jclass cls = env->GetObjectClass(obj);
jmethodID callbackOne = env->GetMethodID(cls, "callback", "(I)V");
if (callbackOne == NULL) {
jclass newExcept = env->FindClass("java/lang/Exception");
if (newExcept != NULL) {
env->ThrowNew(newExcept, "Callback method callback(int) not found.");
}
}

//zweite Callback-Methode erzeugen
jclass cls2 = env->GetObjectClass(obj)
jmethodID callbackTwo = env->GetMethodID(cls, "callback", "(IJLjava/lang/String;)V");
if (callbackTwo == NULL) {
jclass newExcept = env->FindClass("java/lang/Exception");
if (newExcept != NULL) {
env->ThrowNew(newExcept, "Callback method callback(int, long, String) not found.");
}
}
//Aufrufen der ersten Callback-Methode
env->CallVoidMethod(obj, callbackOne, 1);

// String befüllen
std:string test = "abc";
char buffer[128];
strcpy(buffer, test.c_str());
jstring jtest = env->NewStringUTF(buffer);

//Aufrufen der zweiten Callback-Methode
env->CallVoidMethod(obj, callbackTwo, 1, 2, jtest);
}
}