Ich versuche, eine Methode mit jni (Java native Schnittstelle) aufzurufen, aber es stürzt ab, wenn ich die Methode aufrufen. Ich habe die Dokumentation gelesen, also habe ich herausgefunden, dass ich Objekte vom Typ "jvalue" als Parameter verwenden muss, aber wie kann ich ein jobject/j in einen jvalue umwandeln?Aufruf einer Methode mit jni: Bad JNI oop Argument
Hier ist mein aktueller Code:
jclass unsafeClass = (*env).FindClass("sun/misc/Unsafe");
jfieldID unsafeObjFieldID = (*env).GetStaticFieldID(unsafeClass, "theUnsafe", "Lsun/misc/Unsafe;");
jobject theUnsafe = (*env).GetStaticObjectField(unsafeClass, unsafeObjFieldID);
jmethodID defineClassID = (*env).GetMethodID(unsafeClass, "defineClass", "(Ljava/lang/String;[BIILjava/lang/ClassLoader;Ljava/security/ProtectionDomain;)Ljava/lang/Class;");
jsize dataSize = (*env).GetArrayLength(arr);
jbyte* data = (*env).GetByteArrayElements(arr, NULL);
jstring name = (*env).NewStringUTF("Test");
jint n0 = (jint) 0;
// In this method it crashes ._.
(*env).CallObjectMethod(theUnsafe, defineClassID, name, data, n0, dataSize, classLoader, NULL);
hs_err_pid (wenn es helfen würde): http://paste.reflex.rip/okugaluyok.go
EDIT: Ich habe die startparam "-Xcheck: jni" gefunden, jetzt habe ich eine wenig Fehlermeldung.
FATAL ERROR in native method: Bad JNI oop argument
Das geändert, aber es stürzt immer noch an der gleichen Position ab. Ich habe hs_err_pid in der Hauptfrage hinzugefügt. :) – Florian