2016-10-26 15 views
0

jni(Javaネイティブインタフェース)を使用してメソッドを呼び出そうとしていますが、メソッドを呼び出すとクラッシュします。私はドキュメントを読んでいたので、 "jvalue"型のオブジェクトをパラメータとして使う必要があることがわかりましたが、どのようにjobject/jをjvalueに変換できますか? (それが助けになる場合)jni:Bad JNI oop引数を使用したメソッドの呼び出し

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:

は、ここに私の現在のコードですhttp://paste.reflex.rip/okugaluyok.go

編集:今、私は少しのエラーメッセージが表示されました、:私はstartparam "JNI -Xcheck" を見つけました。

FATAL ERROR in native method: Bad JNI oop argument 

答えて

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

これは正しくありません。あなたはそれを作りましたか?それをしないでください。 JNI Specificationを読んでください。私はこれが古いと時代遅れですけど

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

変更されましたが、それでも同じ位置でクラッシュします。主な質問にhs_err_pidを追加しました。 :) – Florian

0

が、これは、この特定のエラーメッセージを持つ唯一のスレッドのようだ:Cにそれがあるべき、完全性については

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

:それはする必要があります。私はOPと同じ設定をしていないが、これをしようとしたときに見つけた

env->CallStaticVoidMethod(jcls, mainMethod); 

私はこの同じエラーが表示されます。これは私のメインクラスの主な静的メソッドを呼び出すことでした。また、同じエラーメッセージ "Bad JNI oop argument"も生成されました。

新しい(空の)jobjectArrayを作成してこれを修正し、メソッドに渡してエラーを修正しました。

jobjectArray args; 
args = env->NewObjectArray(0, env->FindClass("java/lang/String"), 0); 
env->CallStaticVoidMethod(jcls, mainMethod, args); 
関連する問題