java - 无法在 JNI 中调用 ctor?

标签 java c++ java-native-interface

目前在我的应用程序中,我正在使用 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() 的参数列表中存在一些问题。

最佳答案

您的签名中的原语之间不应有任何分号。应该是这样的:

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

注意 II , 不是 I;I .


编辑

你总是可以运行 javap -s <package.name.ClassName>在你构建的类上。

关于java - 无法在 JNI 中调用 ctor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11361891/

相关文章:

java - 使用 Java 实现枚举工资单

c++ - 如何检查对象构造是否完成?

c++ - Char* 相关的内存泄漏

java - 为什么会出现此错误?

java - Tomcat 与 WebSphere 与 WebLogic 的安全性

java - DDD : status - Value Object or Entity?

java - C++ 字符串长度与 java 字符串长度不同。 JNI 安卓

c++ - extern C 是否应该包装我的每一个函数?

java - Atmosphere 与安卓

c++ - 函数名称表示什么以及更多