是C++;JNI函数抛出java异常后调用析构函数?

是C++;JNI函数抛出java异常后调用析构函数?,java,c++,java-native-interface,Java,C++,Java Native Interface,我想知道当抛出com/emcjpn/sleep/sleep algorithmbreakexception时,是否调用了dataArray的~JniFloatArray JNIEXPORT jobject JNICALL Java_com_emcjpn_sleep_SleepAlgorithm_nativePushNewDataAndCalculate(JNIEnv *env, jclass type,

我想知道当抛出
com/emcjpn/sleep/sleep algorithmbreakexception
时,是否调用了
dataArray
~JniFloatArray

JNIEXPORT jobject JNICALL    Java_com_emcjpn_sleep_SleepAlgorithm_nativePushNewDataAndCalculate(JNIEnv *env, jclass type,
                                                                       jlong ptr, jfloatArray data_) {
        JniFloatArray dataArray(data_, env);
        jfloat *data = dataArray.getData();

        SleepAlgorithm* algorithm = (SleepAlgorithm*)ptr;
        jsize length = dataArray.length();
        SleepAlgorithmResult result = algorithm->pushNewDataAndCalculate(data, data + length);
        if (result.shouldBreak) {
            jclass exception = env->FindClass("com/emcjpn/sleep/SleepAlgorithmBreakException");
            env->ThrowNew(exception, "sleep calculation failed, invalid ecg data");
            return NULL;
        }

        /*Some other code*/
    }

对。在JNI文档中很难找到它,但是
env->ThrowNew
实际上不会立即抛出异常。相反,它会进行设置,以便在您返回JavaLand时引发异常


这意味着您必须按照
ThrowNew
进行某种返回(返回Java land),该返回将导致所有析构函数运行。

您是否尝试在析构函数中放置断点?好主意。我将在发布的代码中尝试,在尝试抛出NULL异常对象之前,检查对
FindClass()
的调用是否成功也是一个好主意。