2015-06-22 51 views
1

我試圖執行某種異常處理jni :: ExceptionDescribe是否隱式清除了JNI環境對象的異常跟蹤?

起初我叫 jni::ExceptionDescribe()

後,我用我剛剛任命爲簡單起見printStackTrace()和其中

How to obtain a description of a Java exception in C++ when using JNI?

實施完全正常工作 。

我的問題是,我不能像這樣組合使用它們。

一些C++代碼

void aCppMethod() { 

    jni::ExceptionDescribe(); //Works 
    printStackTrace(); // No stack trace avaiable because JNI Env does not hold any exception 

} 

void aCppMethod() { 
    // jni::ExceptionDescribe(); //commented out 
    printStackTrace(); // Works, where printStackeTrace just prints the Exception into a single log file 

    } 

我的問題是不jni::ExceptionDescribe()隱含刪除從Java環境中對象的例外,是有一個簡單的可能性,在一個簡單的順序使用這兩種功能。

或者更好。是否有任何鉤子或覆蓋機制來增強或改變行爲jni::ExceptionDescribe()

我需要這兩種行爲的原因是因爲我想使用適當的C++代碼作爲簡單的Windows可執行文件,也可以作爲DLL。

+0

Thx。是的,這個錯誤似乎是一個原因。我正在使用JDK和JRE 1.7,因此它不應該發生。我會進一步調查。 – Diversity

+1

@Filip_Bulovic也許他們關閉了它,因爲沒有必要持有跟蹤比不止一個電話。我建議你刪除你的評論,並將其轉化爲答案。我必須問「ORACLE」這個問題。 – Diversity

+0

無論他們有什麼理由關閉它,都應該在報告中正確記錄。 – EJP

回答

1

明顯描述的行爲是18年前在Windows上報告的,請檢查here。然後解釋爲「看起來像是已解決」的bug在2002年被關閉。你所描述的看起來與提到的bug非常相似。

+1

轉載了我。但我認爲它只是封閉的而不是固定的。但對我來說,實施工作並不是問題!但是當我確定我的代碼不會產生這個問題時,也許我可以再次打開一張票!謝謝。順便說一下,這個bug是我的一半。所以,也許我必須再次檢查我的代碼。但我很確定我沒有犯錯。 – Diversity

+1

@多元化的一方面,我們有「它不是錯誤的設計」,另一方面「它看起來像是解決了問題」,並且你想浪費幾天的時間去搞清楚發生了什麼。 –

+0

@ [Filip Bulovic]是的。我認爲你完全正確。這種行爲只是一個設計問題。我越想它,它就越有意義。問題是:jvm應該保存堆棧跟蹤的異常描述調用數量。答案只是1.但在這種情況下,jni :: ExceptionClear沒有意義 – Diversity

2

據沉亮介紹,The Java Native Interface, Addison Wesley 1999,p。 211:

該函數具有清除暫掛異常的副作用。

+0

這對應於他對JDK-4067541的建議以改變規範,JDK 7規範忽略了該行爲[http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp5234] –