Interstage Application Server チューニングガイド |
目次 索引 |
第7章 JDK/JREのチューニング | > 7.3 チューニング/デバッグ技法 | > 7.3.5 JNI処理異常時のメッセージ出力 |
本節では、“-Xcheck:jni”パラメータを指定したときに、図1のメッセージが出力されることがあります。
FATAL ERROR in native method: (詳細メッセージ) |
“(詳細メッセージ)”の部分には、以降で説明する文字列が出力されます。
以降、図1の“詳細メッセージ”が出力される例と注意事項を説明します。
以降の説明を参考にして、JNIの処理部分を見直してください。
JNI received a class argument that is not a class
[異常例]
char buf[1]; (*env)->AllocObject(env, (jclass)buf); //jclass型の第2引数に違う型を指定 |
JNI received a null class
[異常例]
(*env)->AllocObject(env, NULL); //jclass型の第2引数にnullを指定 |
JNI string operation received a non-string
[異常例]
(*env)->GetStringUTFChars(env, NULL, 0); //jstring型の第2引数にNULLを指定 |
Non-array passed to JNI array operations
[異常例]
(*env)->GetArrayLength(env, (jarray)(*env)->NewStringUTF(env, "abc")); //jarray型の第2引数に配列でない型を指定 |
[注意事項]
次の場合は、“-Xcheck:jni”オプションによるメッセージは出力されません。
char buf[1]; (*env)->GetArrayLength(env, (jarray)buf); |
Static field ID passed to JNI
[異常例]
jclass cls = (*env)->GetObjectClass(env, obj); jfieldID fid = (*env)->GetFieldID(env, cls, "static_data", "I"); (*env)->GetIntField(env, obj, fid); //jfieldID型の第3引数にstaticフィールドを指定 |
Null object passed to JNI
[異常例]
jclass cls = (*env)->GetObjectClass(env, obj); jfieldID fid = (*env)->GetFieldID(env, cls, "instance_data", "I"); (*env)->GetIntField(env, NULL, fid); //object型の第2引数にNULLを指定 |
[注意事項]
instance変数かどうかのチェック時のみに出力されるメッセージです。
次の場合は、“-Xcheck:jni”オプションによるメッセージは出力されません。
(*env)->GetObjectClass(env, NULL); //objectの第2引数にNULLを指定 |
Wrong field ID passed to JNI
[異常例]
(*env)->GetIntField(env, obj, -1); //jfieldID型の第3引数に数値を指定 |
[注意事項]
instance変数かどうかのチェック時のみに出力されるメッセージです。
Non-static field ID passed to JNI
[異常例]
jclass cls = (*env)->GetObjectClass(env, obj); (*env)->GetStaticIntField(env, cls, -1); //jfiedlID型第2引数に数値を指定 |
[注意事項]
次の場合は、“-Xcheck:jni”オプションによるメッセージは出力されません。
jclass cls = (*env)->GetObjectClass(env, obj); jfieldID fid = (*env)->GetStaticFieldID(env, cls, "instance_data", "I"); (*env)->GetStaticIntField(env, cls, fid); |
Array element type mismatch in JNI
[異常例]
jintArray intarray = (*env)->NewIntArray(env, 2); (*env)->GetFloatArrayElements(env, intarray, 0); //floatArray型の第2引数にjintArrayを指定 |
Object array expected but not received for JNI array operation
[異常例]
jclass cls = (*env)->GetObjectClass(env, obj); jobjectArray objarray = (*env)->NewObjectArray(env, 1, cls, obj); (*env)->GetIntArrayElements(env, objarray, 0); //intArray型の第2引数にjobjectArray型を指定 |
Field type (static) mismatch in JNI get/set field operations
[異常例]
jclass cls = (*env)->GetObjectClass(env, obj); jfieldID fid = (*env)->GetStaticFieldID(env, cls, "static_data", "I"); (*env)->GetStaticFloatField(env, cls, fid); //GetStaticFloatFieldではなくGetStaticIntFieldでなければならない |
Field type (instance) mismatch in JNI get/set field operations
[異常例]
jclass cls = (*env)->GetObjectClass(env, obj); jfieldID fid = (*env)->GetFieldID(env, cls, "instance_data", "I"); (*env)->GetFloatField(env, obj, fid); //GetFloatFieldではなくGetIntFieldでなければならない |
Wrong static field ID passed to JNI
[異常例]
jclass cls = (*env)->GetObjectClass(env, obj); jclass cls2 = (*env)->GetObjectClass(env, (*env)->NewStringUTF(env, "abc")); jfieldID fid = (*env)->GetStaticFieldID(env, cls, "static_data", "I"); (*env)->GetStaticObjectField(env, cls2, fid); //第2引数はcls2ではなくclsでなければならない |
Using JNIEnv in the wrong thread
[解説]
実行しているスレッドのためのものではないJNIEnvを使用したためのエラーです。
Java VMは、JNIインタフェースポインタ(JNIEnv)が参照する領域を、スレッド固有のデータ領域に割り当てることがあります。このため、JNIインタフェースポインタは、カレントスレッドに対してのみ有効です。ネイティブメソッドは、JNIインタフェースポインタを別のスレッドに渡すといった使い方はできません。
目次 索引 |