Ich kriege immer eine ErrorMessage weil die JVM gecrashed ist. Der Fehlercode ist 0xc0000005. Hab was gegogglet und bin darauf gesto?en, dass dort auf Speicher zugegriffen wird, der gar nicht existiert. Nur verstehe ich das nicbt, da ich in JNI nur eine Methode einer Klasse aufrufe mittels CallVoidMethod.
Erster googlw Treffer war java-forum, konnte ich aber net lesen. Dort ist genau das gleiche passiert
In der hs_err-Datei, die er da rausschreibt, KÖNNTEN relevante Infos stehen (aufpassen, weiter unten stehen da ggf. auch Pfade/Namen, die man nicht unbedingt posten will). Aber allgemein bedeutet das, dass “irgendwo” was schiefgelaufen ist, und u.U. kann man nur SEHR schwer herausfinden, was. Aber… auf welchem Objekt wird die Methode aufgerufen? Irgendeinen Sinn muss das ja haben, es geht ja wohl nicht um sowas wie
class Foo
{
public static native void callSomeVoidMethodOn(Bar bar);
public void doSomething(Bar bar)
{
//bar.someVoidMethod(); // Naah, this is to eeezy....
callSomeVoidMethodOn(bar); // This uses JNI, and is more fancy :-)
}
}
Also ich kann etwas c und wollte nun die ganzen env Methoden ausprobieren… Die Klasse besitzt eine native methode call() und eine normale callImpl() die was auf der Konsole ausgibt. Nun soll die call die callImpl aufrufen(also ein Test sozusagen). Ich checke auch ob die id der Methode NULL iat bevor ich sie aufrufe. Hab mir sen kram mal durchgelesen, da steht nichts wichtiges drin
Ja, ich wollte auch gerade schreiben, dass meine Antwort noch etwas dauert, weil ich die Bilder erst ausdrucken, einscannen und dann eine OCR-Schrifterkennung drüberlaufen lassen muss :o)
Beim Überfliegen sehe ich keinen “offensichtlichen” Fehler, aber JNI hat seine Tücken. Eigentlich müßte man nach fast JEDER Zeile prüfen, ob eine Exception geworfen wurde (ist echt absurd aufwändig). Aber als erste Debug-Schritte könnten die berühmten Ausgaben helfen, auch wenn’s bei JNI eklig-umständlich ist…
Habs -.- es gibt anscheinend die Methode CallVoidMethod(JNIEnv , jclass, jmethodID) und mit CallVoidMethod)JNIEnv, jobject und jmethodID). Hab mich also in dem Parametern vertan :blaem:
Sorry dass ich euch damit aufgehalten hab.
Ja genau das meinte ich. Ich hab es mal so übernommen, bin davon ausgegangen dass das richtig ist.
Das heißt wenn ich ne statische Methode habe muss ich jclass anstatt jobject übergeben oder?
Ja klar… Hab ich vergessen zu erwähnen
Aber das Java 7 Buch ist nicht das einzige das immer jclass übergibt, ich habe des öfteren im Internet gesehen wie immer jclass übergeben wurde. Das scheint aber mit der JNI Version zusammenzuhängen
Kann eigentlich nicht sein. Wenn eine Instanzmethode aufgerufen werden soll, muss auch eine Instanz bekannt sein. Nur die ‚jclass‘ reicht da schlicht nicht. Wenn das auf etlichen anderen Seiten trotzdem so steht, gehe ich mal eher davon aus, dass die das planlos aus der Insel übernommen haben