0

現在、私のアプリケーションでは、C ++(コア実装)とjava(サービスとプレゼンテーション)を使用しています。現在、C ++コアで例外が発生しています。これは、JNIコードでキャッチし、スロー可能なオブジェクトを作成して、Javaレイヤーにスローしています。さらに処理できるようにします。

jniで例外をキャッチするために、次のコードを使用しています。

catch (namespace::MyException& excep) {
    jclass ex = jenv->FindClass("namespace/MyException");
    jmethodID constructor;
    jthrowable object;
    jobject obj;
    if (ex)
    {
            constructor = jenv->GetMethodID(ex, "<init>", "(Ljava/lang/String;Ljava/lang/String;I;I)V");
            if(!constructor)
            {
                SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, (char*) excep.what());
                return $null;
            }

            jstring str = jenv->NewStringUTF(excep.what());
            jstring str2 = jenv->NewStringUTF(excep.GetStackTraceAsString());
            obj = jenv->NewObject(ex, constructor, str, str2,excep.GetCat(),excep.GetCate());

            object = static_cast<jthrowable>(obj);
            jenv->DeleteLocalRef(str);
            jenv->DeleteLocalRef(str2);
            jenv->Throw(object);
    }
    return $null;
}

MyExceptionクラスのC++シグネチャは

MyException(string str1, string str2, int cat1, int cat2);

しかし、私のJniコードでは、MyExceptionCTORのmethodIdを取得できません。

JNIコードで何がうまくいかなかったのか誰か教えてもらえますか?私が疑うのは、GetMethodId()のparameterListに問題があるということです。

4

1 に答える 1

3

シグニチャのプリミティブ間にセミコロンを入れないでください。次のようになります。

(Ljava/lang/String;Ljava/lang/String;II)V

IIではなく、に注意してくださいI;I


編集

javap -s <package.name.ClassName>ビルドしたクラスでいつでも実行できます。

于 2012-07-06T12:17:48.207 に答える