2017-07-27 78 views
0

不知道dataArray~JniFloatArray是否被调用,当com/emcjpn/sleep/SleepAlgorithmBreakException被抛出?从JNI函数抛出java异常之后调用C++析构函数吗?

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*/ 
    } 
+0

您是否尝试在析构函数中放置断点? – efekctive

+0

好主意。我会尝试 –

回答

2

是的。在JNI文档中很难找到,但env->ThrowNew实际上不会立即引发异常。相反,它设置了一些东西,以便在返回到Java-land后引发异常。

这意味着你需要跟随ThrowNew返回某种类型(返回到Java-land),并且该返回将导致所有析构函数运行。

+1

在发布的代码中,在尝试抛出NULL异常对象之前检查对“FindClass()”的调用是否成功也可能是一个好主意。 –

相关问题