2016-10-26 5 views
0

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 

Antwort

0
(*env).CallObjectMethod(theUnsafe, defineClassID, name, data, n0, dataSize, classLoader, NULL); 

Das ist nicht richtig. Hast du es erfunden? Tu das nicht. Lesen Sie die JNI Specification. Es sollte sein:

env->CallObjectMethod(theUnsafe, defineClassID, name, data, n0, dataSize, classLoader, NULL); 

Der Vollständigkeit halber in C sollte es sein:

(*env)->CallObjectMethod(env, theUnsafe, defineClassID, name, data, n0, dataSize, classLoader, NULL); 
+0

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

0

Ich weiß, das alt und überholt ist, aber dies scheint der einzige Thread mit dieser Fehlermeldung zu sein. Ich habe nicht das gleiche Setup wie das OP, aber ich fand, dass, wenn ich versuchte, dies zu tun

env->CallStaticVoidMethod(jcls, mainMethod); 

würde ich diesen gleichen Fehler erhalten. Dies sollte die statische Hauptmethode meiner Hauptklasse aufrufen. Es erzeugte auch die gleiche Fehlermeldung "Bad JNI oop argument".

Ich habe dies behoben, indem ich ein neues (leeres) jobjectArray erstellt und es an die Methode übergeben habe, und es hat meinen Fehler behoben.

jobjectArray args; 
args = env->NewObjectArray(0, env->FindClass("java/lang/String"), 0); 
env->CallStaticVoidMethod(jcls, mainMethod, args);