Fatal Error während der Benutzung von JNI

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

Ein Zeiger, der irgendwo hinzeigt ist auch nicht NULL.
Alles richtig initialisiert?

Glaub schon…

Edit:
Hab den log nochmal angeguckt:
siginfo: ExceptionCode 0xc0000005, reading address 0x00000000
Scheint mir verdächtig

Moin,

BTW: wie sollen wir jetzt Deinen Code zitieren ??? ::banana

Aber schau mal hier (hab’ mal kurz nach “FATAL ERROR 0xc0000005” gegoogled) :
http://www.tomshardware.co.uk/s/0xc0000005+access+violation+fix/
http://www.codeproject.com/Questions/166883/Unhandled-exception-in-exe-0xC0000005-access-viola

Irgendeine der Seiten hat mir vor geraumer Zeit auch mal geholfen !

Gruß
Klaus

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…

printf("env %p
", env);
...
printf("class %p
", class);
...
printf("id %p
", id);
...
printf("CALLING!
");
(*env)->CallVoidMethod(...);
printf("CALLING DONE!
");

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.

Ahja… du hast das ‘class’-Objekt übergeben, und nicht das Objekt, AUF dem die Methode aufgerufen werden sollte. Ja, hätte einem Auffallen können :o

Hab in der Insel nochmal nachgeguckt, da wird das nämlich auch mit dem Class gemacht(soweit ich das sehe…). Daher hab ich das :wink:

Das einzige, was ich dazu auf die Schnelle gefunden habe, ist http://openbook.galileocomputing.de/java7/1507_21_005.html
wo tatsächlich steht


Call<type>Method( JNIEnv *env, jclass clazz, jmethodID methodID, ... );

Obwohl es laut http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp16656
eben


NativeType Call<type>Method(JNIEnv *env, jobject obj, jmethodID methodID, ...);

heißen müßte (das ‘jclass’ statt ‘jobject’ braucht man bei der Variante für static methods).

Ob man das irgendwo melden kann/sollte…?

EDIT: Hab’s mal in das Kontakforumular eingegeben…

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?

Hmja, die Methode heißt aber auch anders, nicht CallVoidMethod sondern CallStaticVoidMethod…

Ja klar… Hab ich vergessen zu erwähnen :wink:
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 :wink:

Das waren auch alles deutsche Seiten… Kann also echt sein.
Bei Reflection wird ja auch die Instanz übergeben und nicht die Class.