JNI完全ガイド(二)——類と異常

3241 ワード

ラベル(スペース区切り):JNI完全ガイド
  :1
  :   
  :    ,    

ジョブ部族、CSDNブログに公開
下一篇:JNI完全ガイド(一)——データ型
[toc]
二、類と異常
2.1クラス
2.1.1クラスのロード
次の方法でクラス定義を使用してクラスをロードできます.
jclass DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize bufLen);
  • name:クラスのフルネームは、UTF-8で符号化された文字列でなければなりません.
  • loader:クラスローダ.
  • buf:クラスデータを含むバッファ.このバッファには元のクラスデータが含まれており、このメソッドを呼び出す前にJVMによって参照されないことが要求されます.
  • bufLen:バッファ長.
  • return:javaクラスオブジェクト.エラーが発生した場合はNULLを返します.

  • 次のような例外が発生する可能性があります.
  • ClassFormatError:クラスフォーマットエラー.
  • ClassCircularityError:クラスループエラー.クラスまたはインタフェースが自分を継承している場合.
  • OutOfMemoryError:メモリオーバーフロー.
  • SecurityException:セキュリティエラー.呼び出し元がJavaパッケージ構造でクラスを定義しようとした場合.

  • 2.1.2クラスの検索
    次の方法でクラス名でクラスを検索できます.
    jclass FindClass(JNIEnv *env, const char *name);
  • name:クラスのフルネーム.UTF-8符号化が使用され、ここで、セパレータは/で表される.
  • return:javaクラスオブジェクト.エラーが発生した場合はNULLを返します.

  • 次のような例外が発生する可能性があります.
  • ClassFormatError
  • ClassCircularityError
  • NoClassDefFoundError:対応するクラスオブジェクトが見つかりません.
  • OutOfMemoryError

  • 2.1.3親の取得
    次の方法で、クラスの親クラスのクラスオブジェクトを取得できます.
    jclass GetSuperclass(JNIEnv *env, jclass clazz);
  • clazz:クエリーが必要なクラスオブジェクト.
  • return:clazzの親クラスオブジェクト.clazzがObjectクラスオブジェクトまたはclazzがインタフェースのクラス情報である場合はNULLを返します.

  • 2.1.4型変換
    あるオブジェクトをあるタイプから別のタイプに変換する前に、このタイプの変換が安全であることを確認する必要があります.この2つのタイプが互いに変換できるかどうかを以下の方法で判断することができる.
    jboolean IsAssignableFrom(JNIEnv *env, jclass clazz1, jclass clazz2);
  • clazz 1:元のタイプ.
  • class 2:ターゲットタイプ.
  • return:現在のタイプ変換が安全かどうか.

  • 2.2異常
    この項では、JNIにおける異常動作に関する方法について説明します.C++では内部の異常メカニズムを使用できますが、このメカニズムが投げ出した異常は私たちのJVMに伝達されません.そのため、この欠点を補うために、JNIはJVMと交流できる異常メカニズムを実現しました.
    2.2.1既存の例外を投げ出す
    次の方法で異常を投げ出すことができます.
    jint Throw(JNIEnv *env, jthrowable obj);
  • obj:java.lang.Throwableオブジェクト.
  • return:異常放出結果.0は、異常がJVMに正常に放出されたことを示します.そうしないと、異常放出に失敗します.

  • 2.2.2新しい例外オブジェクトを投げ出す
    2.3.1では、既存の例外オブジェクトを放出できます.では、私たちが投げ出したい異常については、以下の方法を採用することができます.
    jint ThrowNew(JNIEnv *env, jclass clazz, const char *message);
  • clazz:放出される例外クラス.
  • message:例外メッセージ.UTF-8コードが必要です.
  • return:異常放出結果.0は、異常がJVMに正常に放出されたことを示します.そうしないと、異常放出に失敗します.

  • 2.2.3 JVMから放出された例外の取得
    以前の操作でJVMから放出された例外が存在するかどうかを知る必要がある場合は、ExceptionClearメソッドを呼び出して例外をクリアするまで、例外オブジェクトを取得する方法を呼び出すことができます.
    jthrowable ExceptionOccurred(JNIEnv *env);
  • return:現在発生している異常オブジェクト.異常放出がなければNULLを返します.

  • 2.2.4出力エラーログ
    例外をブロックすると、次の方法でエラースタックの内容を印刷できます.JavaのprintStackTraceのように:
    void ExceptionDescribe(JNIEnv *env);
    2.2.5異常情報のクリア
    次のメソッドを呼び出して、現在発生しているすべての例外情報をクリアします.
    void ExceptionClear(JNIEnv *env);
    2.2.6重大なエラーが発生
    上記の異常に対しては,発生しても遮断してもよい.しかし、いくつかのエラーが発生してプログラムが正常に動作しなくなった場合、JVMにエラーメッセージを送信することができ、プログラムが終了します.
    void FatalError(JNIEnv *env, const char *msg);
  • msg:エラーメッセージ.UTF-8.

  • 2.2.7異常情報の有無を検査する
    現在異常が発生しているかどうかを以下の方法で確認できます.
    jboolean ExceptionCheck(JNIEnv *env);
  • return:異常情報が存在するかどうか.

  • 上一篇:JNI完全ガイド
    参考文献:[1]ORACLE guides for JNI-Chapter 4:JNI Functions