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 代码中,我无法获取 MyException CTOR 的 methodId。

谁能告诉我 JNI 代码中可能出了什么问题。我怀疑 GetMethodId() 的参数列表中存在一些问题。

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 回答