无法在JNI中拨打ctor?

时间:2012-07-06 12:06:42

标签: java c++ java-native-interface

目前在我的应用程序中,我使用的是C ++(核心实现)和java(服务和演示)。现在在我的C ++核心中,我得到一个异常,我正在捕获JNI代码并创建它的throwable对象,并将其抛给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()中的parameterList存在一些问题。

1 个答案:

答案 0 :(得分:3)

签名中的基元之间不应有任何分号。它应该是这样的:

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

请注意II,而不是I;I


修改

您始终可以在构建的类上运行javap -s <package.name.ClassName>